CMake之配置构建

news/2025/3/26 2:20:16/

目录

  • 使用与平台无关的文件操作
  • 构建时运行自定义命令
  • 编译和链接命令
  • 生成器表达式

使用与平台无关的文件操作

这个例子中解压缩Eigen打包文件,并相应的为目标设置包含目录

cmake_minimum_required(VERSION 3.20 FATAL_ERROR)
project(recipe-01 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD_REQUIRED ON)add_custom_target(unpack-eigenALLCOMMAND ${CMAKE_COMMAND} -E tar xzf ${CMAKE_CURRENT_SOURCE_DIR}/eigen-3.4.0.tar.gz # 并不会真正解压一个实体目录出来COMMAND ${CMAKE_COMMAND} -E rename eigen-3.4.0 eigen # 这里会报错:Error renaming from "eigen-3.4.0" to "eigen": Directory not emptyWORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}COMMENT "Unpacking eigen"
)add_executable(linear-algebra linear-algebra.cpp
)add_dependencies(linear-algebra unpack-eigen)
target_include_directories(linear-algebraPRIVATE${CMAKE_CURRENT_BINARY_DIR}/eigen  # 上面rename 命令所在行删掉后,这里为啥还是能找到eigen?
)

代码中使用到eigen-3.4.0.tar.gz中的源代码文件,但没有实体解压就可以引用到。

构建时运行自定义命令

cmake提供了三个选项来在构建时执行自定义命令

  1. add_custom_command:编译目标,生成输出文件
  2. add_custom_target 这个命令的执行没有输出
  3. 构建目标前后,add_custom_command的执行可以没有输出

编译和链接命令

cmake_minimum_required(VERSION 3.9 FATAL_ERROR)
project(recipe-06 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD_REQUIRED ON)find_package(OpenMP)
if(OpenMP_FOUND)message(STATUS "package found")set(_scratch_dir ${CMAKE_CURRENT_BINARY_DIR}/omp_try_compile)
else()message(STATUS "package not found")
endif()try_compile(omp_taskloop_test_1${_scratch_dir}SOURCES${CMAKE_CURRENT_SOURCE_DIR}/taskloop.cppLINK_LIBRARIESOpenMP::OpenMP_CXX
)message(STATUS "result of try_compile: ${omp_taskloop_test_1}")include(CheckCXXSourceCompiles)
file(READ ${CMAKE_CURRENT_SOURCE_DIR}/taskloop.cpp _snippet)
set(CMAKE_REQUIRED_LIBRARIES OpenMP::OpenMP_CXX)
check_cxx_source_compiles("${_snippet}" omp_taskloop_test_2)
unset(CMAKE_REQUIRED__LIBRARIES)
message(STATUS "Result of check_cxx_source_compiles: ${omp_taskloop_test_2}")
  • 要编译的代码片段必须作为CMake变量传入,大多数情况下必须使用file(READ …)来读取,然后代码片段被保存到构建目录的 CMakeFiles/CMakeTmp 子目录中
  • 微调编译和链接,必须通过设置以下CMAKE变量进行:
    • CMAKE_REQUIRED_FLAGS :设置编译器标志
    • CMAKE_REQUIRED_DEFINITIONS :设置预编译宏
    • CMAKE_REQUIRED_INCLUDES:设置包含目录列表
    • CMAKE_REQUIRED_LIBRARIES:设置可执行目标能够链接的库列表
  • 调用check_<lang>_compiles_function之后,必须手动取消对这些变量的设置,确保后续使用中不会保留当前的内容

生成器表达式

CMake分两个阶段生成项目的构建系统:配置阶段(解析CMakeLists.txt)和生成阶段(实际生成构建环境)。生成器表达式在第二阶段进行计算,可以使用仅在生成时才能知道的信息来调整构建系统。生成器表达式在交叉编译时很有用,一些可用的信息只有解析CMakeLists.txt之后或者在多配置项目后获取,构建系统生成的所有项目可以有不同的配置。
生成器表达式对于在访问或操作文件路径时很出色。
CMake提供了三种类型的生成器表达式:

  • 逻辑表达式,基本模式为 $condition:outcome 。condition为0表示false,1表示true
  • 信息表达式,基本模式为 $ 或 $information:input
  • 输出表达式,模式为$ 或 $operation:input 这些表达式可能基于一些输入参数,生成一个输出,他们的输出可以直接在CMake命令中使用,也可以与其他生成表达式组合使用

http://www.ppmy.cn/news/69119.html

相关文章

MySQL --- 事务,索引

1. 事务 场景&#xff1a;学工部整个部门解散了&#xff0c;该部门及部门下的员工都需要删除了。 在部门表当中维护的是部门的相关信息&#xff0c;在员工表当中维护了员工的相关信息&#xff0c;在员工表当中有一个字段dept_id关联的就是部门表的主键。 操作&#xff1a; …

TDengine数据库与Mybatis-plus 多租户屏蔽

使用TDengine时序数据库特有的查询: select sum(gen_power_total) gen_power_totals,last(ts) xdate from power.device_0123456 where ts >2023-05-16 08:53:05 and ts < 2023-05-17 08:53:05 interval(1h) ; 错误提示…

Vue 组件的概念、组件的分类、组件的使用、组件之间的通信等方面

在 Vue 中&#xff0c;组件是构建应用程序的基本单元之一。组件可以让我们将页面分割成独立的模块&#xff0c;每个模块都有自己的状态和行为。在这篇文章中&#xff0c;我们将介绍 Vue 组件的概念、组件的分类、组件的使用、组件之间的通信等方面&#xff0c;希望能够为您的面…

基本数据类型不一定存储在栈中,是不是颠覆了你的认知

大家好&#xff0c;我是三叔&#xff0c;很高兴这期又和大家见面了&#xff0c;有很多小伙伴问我&#xff0c;基本数据类型一定在栈内存中吗&#xff1f;网上答案也是五花八门&#xff0c;部分读者都有被误导过&#xff0c;基本数据类型不一定在栈内存中&#xff01; 虽然基本…

Linux入门篇-安装CentOS

一、先组织硬件 先把“买”一台空白的电脑&#xff0c;再进行操作系统的安装。 windows中&#xff0c;处理器&#xff1a; 本机 实际运行的时候能当多少个CPU来使呢&#xff1f;16个 处理器的数量是CPU的数量&#xff1b;&#xff08;本机上一个插槽&#xff0c;就只有一个CP…

3年测试技术面一题都看不懂,字节面试真的变态.....

最近我的一个读者朋友去了字节面试&#xff0c;来给我发信息吐槽&#xff0c;说字节的面试太困难了&#xff0c;像他这种三年经验的测试员&#xff0c;在技术面&#xff0c;居然一题都答不上来&#xff0c;这要多高的水平才能有资格去面试字节的测试岗位。 确实&#xff0c;字…

ASEMI代理ADI亚德诺ADUM3211TRZ-RL7原厂芯片

编辑-Z ADUM3211TRZ-RL7参数描述&#xff1a; 型号&#xff1a;ADUM3211TRZ-RL7 数据速率&#xff1a;10 Mbps 传播延迟&#xff1a;50 ns 脉冲宽度失真&#xff1a;3 ns 脉冲宽度&#xff1a;100 ns 输出上升/下降时间&#xff1a;2.5 ns 供电电流&#xff1a;2.6 mA …

Qt——Qt控件之输入窗口-QDial数字拨盘框控件的使用总结(例程:旋转码盘改变数值显示 )

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》