Cmake
Cmake
子文档:Gtest
B站[1]
CMakeLists 语法
1 |
|
set
1 |
|
缓存变量
1 |
|
set_target_properties
1 |
|
message
1 |
|
find_package
1 |
|
add
add_executable
1 |
|
add_subdirectory添加子模块
1 |
|
添加路径以后就会扫描PATH存在CMakeLists.txt文件,构建子模块。
add_library
1 |
|
include
include_directories
1 |
|
target
target_include_directories
1 |
|
target_link_libraries
1 |
|
特性 | GTest::GTest 和 GTest::Main |
gtest 和 gtest_main |
---|---|---|
命名空间 | 使用命名空间(GTest:: ),更规范 |
直接使用库名称,无命名空间 |
依赖管理 | 自动处理依赖(如 pthread ) |
需要手动处理依赖(如 pthread ) |
现代 CMake 支持 | 符合现代 CMake 最佳实践 | 不符合现代 CMake 最佳实践 |
可移植性 | 更好,适用于不同平台和构建系统 | 较差,可能在某些平台上无法正常工作 |
代码简洁性 | 更简洁,无需手动处理依赖 | 需要手动处理依赖,代码稍显冗长 |
install
include_directories() 和 target_include_directories()区别
在 CMake 中,include_directories() 和 target_include_directories() 都用于指定头文件的搜索路径,但它们的作用范围和使用方式有显著区别。
相同点:
两者都用于添加头文件的搜索路径,编译器会在这些路径中查找 #include 指令中指定的头文件。
两者都支持绝对路径和相对路径,相对路径是相对于当前 CMakeLists.txt 文件所在的目录。
两者都可以用于指定公共头文件路径(PUBLIC)、私有头文件路径(PRIVATE)或接口头文件路径(INTERFACE)。
区别:
特性 | include_directories() |
target_include_directories() |
---|---|---|
作用范围 | 全局作用域,影响所有目标(target)。 | 仅作用于指定的目标(target)。 |
推荐使用场景 | 适用于简单的项目或旧版 CMake 项目。 | 适用于现代 CMake 项目,推荐优先使用。 |
目标关联性 | 不直接关联到特定目标,可能影响所有目标。 | 显式关联到特定目标,避免污染其他目标。 |
可维护性 | 较差,容易导致全局路径污染。 | 较好,路径与目标绑定,逻辑清晰。 |
作用域控制 | 无法精确控制路径的作用范围。 | 可以通过 PUBLIC 、PRIVATE 、INTERFACE 精确控制路径的作用范围。 |
现代 CMake 推荐 | 不推荐使用,除非有特殊需求。 | 推荐使用,符合现代 CMake 的最佳实践。 |
CMake 构建流程[2]
1 |
|
mkdir build && cd build && cmake .. && make -j4
make clean
CMakeLists 高级特性
自定义脚本
在项目目录下创建一个 cmake/ 目录,用于存放自定义 CMake 模块
在 cmake/ 目录下创建一个 MyModule.cmake 文件
在 CMakeLists.txt 文件中包含自定义模块:
1
2list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")# 扩展CMake模块搜索路径
include(MyModule) # 加载并执行指定的 CMake 模块文件(文件名称为MyModule)
1 |
|
CMake 跨平台特性 | 交叉编译
以当前系统为x86_64ubuntu为目标系统为aarch64(jetson)编译pcl库为例,失败,认为交叉编译就是xxx,建议使用docker搭建环境,下面给出一个较为详细的
知乎[3]
选择性编译
1 |
|
自定义命令 (add_custom_command 命令)
1 |
|
资源链接-CMake
Cmake
http://example.com/post/cmake-zsai8o.html