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

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 定义项目的构建规则、依赖关系和安装规则,支持多种编译器和构建工具,尤其适合跨平台项目开发。

相关文章:

  • C++(26): 标准库 <iterator>
  • 基于python的机器学习(八)—— 评估算法(一)
  • 策略的组合与叠加多策略联合交易
  • 前端面经-nginx/docker
  • RTMP协议解析【三】
  • Linux服务器SOS Report完全指南:收集方法、作用解析与最佳实践
  • WPF···
  • 哥德巴赫猜想
  • 本特利内华达125768-01 RIM i/o模块规范
  • 8.2 线性变换的矩阵
  • QT的自定义控件
  • UI自动化测试框架:PO模式+数据驱动
  • 回表是数据库概念,还是mysql的概念?
  • 业务逻辑篇水平越权垂直越权未授权访问检测插件SRC 项目
  • 86.评论日记
  • 人工智能范式:技术革命下的认知重构
  • 手机充电协议
  • AI智能分析网关V4玩手机检测算法精准管控人员手机行为,搭建智慧化安防监管体系
  • 心联网(社群经济)视角下开源AI智能名片、链动2+1模式与S2B2C商城小程序源码的协同创新研究
  • 小刚说C语言刷题—1153 - 查找“支撑数”
  • 白玉兰奖评委会主席陈宝国:好作品要有筋骨有血肉更要有戏魂
  • 福州市委副书记、福州新区党工委书记陈云水转任三明市政协党组书记
  • 小满:一庭栀子香
  • 昆明市委:今年起连续三年,每年在全市集中开展警示教育
  • “集团结婚”:近百年前革新婚俗的尝试
  • 学人、学术、学科、学脉:新时代沾溉下的中国西方史学史