1.以一个C++开源软件PPPLib为例
下面是该项目工程的最原始的文件夹存储:
打开终端,输入:mkdir build && cd build
此时,多了一个build文件夹,并且此时的终端也在build文件夹下
继续输入:cmake ..
然后输入:make
执行完毕后,查看build文件夹,可以看到build文件夹下多了很多文件:
这其实是对主目录PPPLib-CSDN下的CMakeLists.txt文件进行cmake和make处理后才得到的。
此外,在主目录下还生成了一个bin文件夹,该文件夹下存储的是经过cmake和make后生成的静态和动态链接库,用于把这些程序进行链接,构建成一个完整的项目工程:
2.查看主目录下的CMakeLists.txt并解释:
bash
PROJECT(PPPLib) #定义了该项目的名称,PPPLib
CMAKE_MINIMUM_REQUIRED(VERSION 3.5) #指定Cmake的最小版本
#设置了 CMake 策略 CMP0015 为 "NEW"。CMP0015 是关于在不同目录中包含相同名称的文件时如何处理的策略。设置为 "NEW" 表示使用新的行为,即允许在不同目录中包含相同名称的文件
CMAKE_POLICY(SET CMP0015 NEW)
set(CMAKE_CXX_STANDARD 11) #设置C++语言的标准版本,这里是C11
set(CMAKE_BUILD_TYPE Debug) #指定了构建类型,默认为"Debug",表示是调试版本
set(CMAKE_CXX_FLAGS "-std=c++11 -fPIC") #设置了 C++ 编译器的标志,这里指定了使用 C++11 标准和生成位置无关代码(Position Independent Code,用于动态链接)。
set(CMAKE_CXX_COMPILE "g++") #指定C++编译器为gcc
set(CMAKE_C_COMPILE "gcc") #指定了c编译器为gcc
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) #设置了 CMake 查找模块的路径,这里是项目源代码目录下的 "cmake" 子目录
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) #设置了可执行文件的输出路径,这里是项目源代码目录下的 "bin" 子目录
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) #设置了库文件的输出路径,同样是项目源代码目录下的 "bin" 子目录。
find_package(PythonLibs) #尝试查找 Python 库,以便在项目中使用 Python 相关的功能
include_directories(${PROJECT_SOURCE_DIR}/include) #将项目源代码目录下的 "include" 子目录添加到包含路径中,这样编译器可以找到头文件
include_directories(${PROJECT_SOURCE_DIR}/3rdparty) #将项目源代码目录下的 "3rdparty" 子目录添加到包含路径中,这通常是第三方库的目录
include_directories(${PROJECT_SOURCE_DIR}/3rdparty/Eigen) #将项目源代码目录下的 "3rdparty/Eigen" 子目录添加到包含路径中,Eigen 是一个高级 C++ 库,用于线性代数、矩阵和向量运算。
IF(WIN32) #如果当前平台是 Windows,则执行以下代码
include_directories(${PROJECT_SOURCE_DIR}/windows) #将项目源代码目录下的 "windows" 子目录添加到包含路径中
ENDIF() #结束了条件判断。
add_subdirectory(src) #告诉 CMake 在构建过程中包含 "src" 子目录,这个目录通常包含源代码文件。
add_subdirectory(exe) #告诉 CMake 在构建过程中包含 "exe" 子目录,这个目录可能包含可执行文件的源代码或者额外的构建脚本
3.进入到主目录下的src文件夹下的CMakeList.txt文件
bash
PROJECT(PPPLib_v2.0)
CMAKE_MINIMUM_REQUIRED(VERSION 3.5)
CMAKE_POLICY(SET CMP0015 NEW)
#包含并构建位于 ${PROJECT_SOURCE_DIR}/xxxxxxx 目录下的子项目。
add_subdirectory(${PROJECT_SOURCE_DIR}/CmnFunc)
add_subdirectory(${PROJECT_SOURCE_DIR}/LogInfo)
add_subdirectory(${PROJECT_SOURCE_DIR}/ReadFiles)
add_subdirectory(${PROJECT_SOURCE_DIR}/DecodeRaw)
add_subdirectory(${PROJECT_SOURCE_DIR}/GnssFunc)
add_subdirectory(${PROJECT_SOURCE_DIR}/InsFunc)
add_subdirectory(${PROJECT_SOURCE_DIR}/Solver)
add_subdirectory(${PROJECT_SOURCE_DIR}/AdjFunc)
#add_subdirectory(${PROJECT_SOURCE_DIR}/PlotFunc)
add_subdirectory(${PROJECT_SOURCE_DIR}/OutSol)
file(GLOB SRC_FILES "*.cc") #使用 file(GLOB ...) 命令查找当前目录下所有的 .cc 源文件,并将它们存储在变量 SRC_FILES 中
add_library(PPPLib ${SRC_FILES}) #创建了一个名为 PPPLib 的库,库的类型由源文件决定(例如,如果源文件是 C++,则创建的是静态或动态库)
#这行将 PPPLib 库与一系列其他库链接起来。这些库可能是之前通过 add_subdirectory 命令构建的,或者在其他地方定义的
target_link_libraries(PPPLib CmnLib ReadLib DecodeRawLib GnssLib InsLib SolverLib AdjLib OutLib)
4.进入src文件夹下的任意一个文件夹如AdjFunc文件夹下的CMakeLists.txt
bash
PROJECT(AdjLib) #指定当前项目的名称,指定当前子目录下构建的库或者应用程序的名称
CMAKE_MINIMUM_REQUIRED(VERSION 2.8) #要求的Cmake的最低版本
CMAKE_POLICY(SET CMP0015 NEW)
file(GLOB SRC_FILES "*.cc") #使用 file(GLOB ...) 命令查找当前目录下所有的 .cc 源文件,并将它们存储在变量 SRC_FILES 中。这些文件将被编译成目标库的一部分
add_library(AdjLib ${SRC_FILES}) #创建了一个名为 AdjLib 的库,库的类型由源文件决定(例如,如果源文件是 C++,则创建的是静态或动态库)。这里,库名与项目名相同,都是 AdjLib
# 告诉 CMake 在构建 AdjLib 库时,需要链接 LogLib 和 CmnLib 这两个库。具体来说:
# AdjLib 是当前正在构建的目标库。
# LogLib 和 CmnLib 是其他库,它们可能包含 AdjLib 需要使用的函数或资源。
target_link_libraries(AdjLib LogLib CmnLib)
5.进入主目录下的include文件夹(这个文件夹下存储着程序的头文件.h文件)
6.进入主目录下的exe文件夹下的CMakeLists.txt
bash
PROJECT(test_main)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
CMAKE_POLICY(SET CMP0015 NEW)
#原作者做测试用的
#add_executable(test_SPP test_SPP.cc)
#target_link_libraries(test_SPP PPPLib)
#
#add_executable(test_PPP test_PPP.cc)
#target_link_libraries(test_PPP PPPLib)
#
#add_executable(test_PPK test_PPK.cc)
#target_link_libraries(test_PPK PPPLib)
#
#add_executable(test_LC_FUSION test_LC_FUSION.cc)
#target_link_libraries(test_LC_FUSION PPPLib)
#add_executable(test_TC_FUSION test_TC_FUSION.cc)
#target_link_libraries(test_TC_FUSION PPPLib)
#add_executable(FormatFiles FormatFiles.cc)
#target_link_libraries(FormatFiles PPPLib)
add_executable(PPPLibMain PPPLibMain.cc) #添加一个名为 "PPPLibMain" 的可执行文件,它由 PPPLibMain.cc 源文件编译而成
target_link_libraries(PPPLibMain PPPLib) #将 "PPPLibMain" 可执行文件与 "PPPLib" 库链接
7.进入主目录下的3rdparty文件夹
主目录下的CMakeLists.txt文件中:
把包含在exe文件夹下的CMakeLists.txt文件中要求加入可执行程序的PPPLibMain链接成目录下的bin可执行程序:
在src文件夹下的所有文件夹下的.cc源文件全部创建成相应的库,然后该src文件夹下的创建的PPPLib库链接起来,该PPPLib库最后与可执行程序PPPLibMain链接到一起: