一个CMake项目中的文件的整体结构

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链接到一起:

相关推荐
智者知已应修善业2 分钟前
2021-04-22 51单片机玩转点阵
经验分享·笔记·单片机·嵌入式硬件·51单片机
Chef_Chen7 分钟前
从0开始学习机器学习--Day19--学习曲线
人工智能·学习·机器学习
Bearnaise38 分钟前
PointMamba: A Simple State Space Model for Point Cloud Analysis——点云论文阅读(10)
论文阅读·笔记·python·深度学习·机器学习·计算机视觉·3d
怀旧6661 小时前
spring boot 项目配置https服务
java·spring boot·后端·学习·个人开发·1024程序员节
infiniteWei2 小时前
【Lucene】原理学习路线
学习·搜索引擎·全文检索·lucene
follycat3 小时前
[极客大挑战 2019]PHP 1
开发语言·学习·网络安全·php
weixin_518285054 小时前
深度学习笔记11-神经网络
笔记·深度学习·神经网络
并不会7 小时前
常见 CSS 选择器用法
前端·css·学习·html·前端开发·css选择器
龙鸣丿7 小时前
Linux基础学习笔记
linux·笔记·学习
Nu11PointerException9 小时前
JAVA笔记 | ResponseBodyEmitter等异步流式接口快速学习
笔记·学习