当前位置: 首页 > ds >正文

CMake 跨平台构建系统详解

CMake 跨平台构建系统详解

1. CMakeLists.txt 文件结构

CMake 的配置文件是 CMakeLists.txt,包含定义项目构建过程的指令。

基本结构

cmake_minimum_required(VERSION <version>)
project(<project_name>)# 添加源文件和目标
add_executable(<target_name> <source_files>)

示例

cmake_minimum_required(VERSION 3.10)
project(MyProject)
add_executable(MyExecutable main.cpp)

2. 常用指令

cmake_minimum_required

指定 CMake 的最低版本要求:

cmake_minimum_required(VERSION 3.10)

project

定义项目名称及支持的语言:

project(MyProject C CXX)

add_executable

定义可执行文件目标:

add_executable(MyExecutable main.cpp)

add_library

定义库目标(静态库或共享库):

add_library(MyLibrary STATIC mylib.cpp)
add_library(MySharedLibrary SHARED mysharedlib.cpp)

target_include_directories

为目标添加包含目录:

target_include_directories(MyExecutable PRIVATE ${SOME_INCLUDE_DIR})

target_link_libraries

为目标链接库:

target_link_libraries(MyExecutable PRIVATE MyLibrary)

target_compile_options

为目标添加编译选项:

target_compile_options(MyExecutable PRIVATE -Wall)

find_package

查找已安装的包:

find_package(Boost REQUIRED)

include_directories

添加全局包含目录(已过时,推荐使用 target_include_directories):

include_directories(${SOME_INCLUDE_DIR})

link_libraries

添加全局链接库(已过时,推荐使用 target_link_libraries):

link_libraries(MyLibrary)

set

设置变量值:

set(MY_VARIABLE "value")

message

输出消息:

message(STATUS "This is a message")

3. 变量

定义变量

set(MY_VARIABLE "value")

使用变量

message(STATUS "The value is ${MY_VARIABLE}")

环境变量

通过 $ENV{VARIABLE_NAME} 访问环境变量。


4. 条件语句

示例

if(WIN32)message(STATUS "Windows system")
elseif(UNIX)message(STATUS "Unix system")
else()message(STATUS "Unknown system")
endif()

5. 循环语句

foreach

foreach(item IN LISTS my_list)message(STATUS "Item: ${item}")
endforeach()

while

set(count 0)
while(${count} LESS 5)message(STATUS "Count: ${count}")math(EXPR count "${count} + 1")
endwhile()

6. 函数和宏

函数

function(my_function arg1 arg2)message(STATUS "Argument 1: ${arg1}")message(STATUS "Argument 2: ${arg2}")
endfunction()
my_function("Hello" "World")

macro(my_macro arg1 arg2)message(STATUS "Argument 1: ${arg1}")message(STATUS "Argument 2: ${arg2}")
endmacro()
my_macro("Hello" "World")

7. 生成文件

生成 Makefile

cmake -B build

生成 Visual Studio 项目

cmake -B build -G "Visual Studio 16 2019"

生成 Xcode 项目

cmake -B build -G Xcode

8. 多配置生成器

设置默认配置

set(CMAKE_CONFIGURATION_TYPES Debug Release)

指定构建配置

cmake --build build --config Debug

9. 安装规则

示例

install(TARGETS MyExecutable DESTINATION bin)
install(FILES README.md DESTINATION share/doc/myproject)

10. 测试

示例

enable_testing()
add_executable(MyTest test.cpp)
add_test(NAME MyTest COMMAND MyTest)

11. 包管理

示例

find_package(Boost REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})
target_link_libraries(MyExecutable ${Boost_LIBRARIES})

12. 自定义目标

示例

add_custom_target(clean_docs COMMAND rm -rf docs)

13. 完整示例

cmake_minimum_required(VERSION 3.10)
project(MyProject C CXX)# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)# 添加可执行文件
add_executable(MyExecutable main.cpp)# 添加库
add_library(MyLibrary STATIC mylib.cpp)# 设置包含目录
target_include_directories(MyExecutable PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)# 链接库
target_link_libraries(MyExecutable PRIVATE MyLibrary)# 定义安装规则
install(TARGETS MyExecutable DESTINATION bin)
install(FILES README.md DESTINATION share/doc/myproject)# 定义测试
enable_testing()
add_executable(MyTest test.cpp)
add_test(NAME MyTest COMMAND MyTest)

14. 运行 CMake

配置项目

cmake -B build

构建项目

cmake --build build

安装项目

cmake --install build --prefix /path/to/install

运行测试

ctest --test-dir build

15. 常见问题

问题 1:找不到包

  • 解决方法
    • 确保包已正确安装。
    • 设置 CMAKE_PREFIX_PATHCMAKE_MODULE_PATH
    • 使用 find_pathfind_library 手动查找。

问题 2:跨平台构建

  • 解决方法
    • 确保目标平台的工具链已配置。
    • 使用 CMAKE_TOOLCHAIN_FILE 指定工具链文件。

总结

CMake 通过 CMakeLists.txt 定义项目的构建规则、依赖关系和安装规则,支持多种编译器和构建工具,尤其适合跨平台项目开发。

http://www.xdnf.cn/news/8066.html

相关文章:

  • 友达15.6寸G156HAN02.3工业显示模组
  • 在Linux系统上备份另一个系统的做法
  • 数据库主从集群 + GTID 实现高可用
  • inlier_outlier
  • 视觉大模型学习总结
  • 通过 curl 精准定位问题
  • 从零开始的嵌入式学习day25
  • Java SSM与SpringBoot面试题全面解析:从基础到源码
  • 线性表数据结构-队列
  • 8:点云处理—常见的四种3D相机
  • 今日行情明日机会——20250521
  • 探索Puter:一个基于Web的轻量级“云操作系统”
  • Java基础 5.21
  • 重磅升级!Google Play商店改版上线
  • Web服务器
  • C++语言的跨平台挑战和应对策略
  • centos7 p8p1使用ip addr查看时有的时候有两个ip,有的时候只有一个ip,有一个ip快,有一个ip慢
  • 如何在 Windows 10 或 11 上使用命令提示符安装 Angular
  • Vue Router动态路由与导航守卫实战
  • RESTful风格
  • 从零基础到最佳实践:Vue.js 系列(6/10):《Composition API(组合式 API)》
  • 论文篇目录-研究生如何阅读编写论文
  • Linux系统编程-DAY02
  • 直播美颜SDK技术解析:滤镜渲染与动态贴纸引擎融合的底层实现
  • 机器学习第二十讲:网格搜索 → 像尝试所有密码组合找最佳解锁方式
  • Python爬虫实战:获取天气网最近一周北京的天气数据,为日常出行做参考
  • java的synchronized 原理及功能
  • 继DeepSeek之后,又一国产模型迎来突破,或将解答手机端AI的疑惑
  • 教培机构线上线下课程小程序开发:构建数字化教育新生态
  • 模板初阶【C++】