文章目录
1. 介绍
基于CMake的构建系统是由一组高级抽象的逻辑目标(target)构成的,每个目标对应一个可执行文件、库文件,或者是一个由自定命令组成的自定义目标。在构建系统中通过确定目标之间的依赖关系,来确定构建顺序以及生成规则。
CMake本身是跨平台的,它可以生成适合各种操作系统和编译器的构建文件。基于CMake的编译过程主要有以下步骤:
- 编写CMakeLists.txt文件:
mkdir build && cd build && cmake ..通过cmake ..指向CMakeLists.txt所在目录。 - 用
cmake命令将CMakeLists.txt文件转化为make所需要的Makefile文件:cmake ..会在build目录下生成Makefile文件。 - 用
make命令编译源码生成可执行文件或库:make根据生成的Makefile文件,编译程序。
2. 基础用法
2.1. 二进制目标(Target)
可执行文件和库是使用 add_executable() 和 add_library() 命令定义的。生成的二进制文件具有适合目标平台的 PREFIX、SUFFIX 和扩展名。二进制目标之间的依赖关系使用 target_link_libraries() 命令表示:
add_library(archive archive.cpp zip.cpp lzma.cpp)
add_executable(zipapp zipapp.cpp)
target_link_libraries(zipapp archive)
由archive.cpp、zip.cpp、lzma.cpp编译为archive静态库文件,由zipapp.cpp编译为一个可执行文件,在zipapp文件时会把archive文件链接过来。
2.2. 添加可执行文件
通过add_executable命令来定义一个可执行可执行文件目标。
add_executable(my_app
src/main.cpp
src/utils.cpp
src/module/foo.cpp
)
2.3. 采集源文件
显示声明
set(APP_SOURCES
src/main.cpp
src/module1/foo.cpp
)
set(MODULE2_SOURCES
src/module2/bar.cpp
src/module2/baz.cpp
)
add_executable(target ${APP_SOURCES} ${MODULE2_SOURCES})
2.4. 采集头文件
显示声明(推荐)
声明包含目录,target_include_directories 为特定的目标(可执行文件或库)指定头文件搜索路径,可以为不同的目标设置不同的头文件路径。
# 适用于接口明确的库项目
set(PUBLIC_HEADERS
${CMAKE_SOURCE_DIR}/hello/include
${CMAKE_SOURCE_DIR}/world/include
)
# 将头文件关联到目标
target_include_directories(target PUBLIC ${PUBLIC_HEADERS})
- PRIVATE:仅对当前目标可见。
- PUBLIC:对当前目标和链接到它的其他目标可见。
- INTERFACE:仅对链接到它的其他目标可见(用于纯头文件库)。
2.5. 添加库文件
创建库文件
add_library命令创建库文件,该命令可以指定库的类型(静态库STATIC或共享库SHARED)。
链接库文件
# 推荐:直接使用绝对路径链接库
target_link_libraries(target PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/lib/libcustom.so
)
2.6. 构建子目录
add_subdirectory命令可以将指定的子目录添加到当前的构建过程中。允许在主CMakeLists.txt文件里包含并处理其他子目录中的CMakeLists.txt文件,从而实现项目的模块化管理。当调用这个命令时,CMake会进入到指定子目录,执行其中的CMakeList.txt文件,将子目录中的目标(target)添加到整个项目的构建系统中。
3. 常用命令
CMakeLists.txt 文件中的命令不区分大小写,但参数和变量是区分大小写的。
3.1. 项目命令
project(xxx):设置project名称。会自动创建PROJECT_SOURCE_DIR 和 PROJECT_NAME两个变量。
${PROJECT_SOURCE_DIR}: 本CMakeLists.txt所在的文件夹路径${PROJECT_NAME}: 本 CMakeLists.txt的project名称
3.2. 设置变量
set(变量 文件名/路径/...):给文件名/路径名或者其他字符串起别名,用${变量}获取变量内容。
设置编译模式
- 设置为 Release 模式:SET(CMAKE_BUILD_TYPE Release)
- 设置为 debug 模式:SET(CMAKE_BUILD_TYPE debug)
3.3. 其他
option命令可用来定义一个布尔类型的选项,用户能够通过 CMake GUI 或者命令行参数对其值进行修改。该命令常用于开启或关闭某个特定的功能。
file命令的READ选项可以读取文件内容并将其赋值给变量。
execute_process命令可以执行外部命令,并将命令的输出结果赋值给变量。

7482

被折叠的 条评论
为什么被折叠?



