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

CMake学习笔记(二):变量设值,源文件/文件查找

一_变量设值:

在上一节中我们知道了如何去链接起来多个源文件并且生成可执行文件,但是当我们的源文件过多的时候会导致我们在add_executable里面写很长的一串,所以我们可以使用变量来进行设值:

set(<variable> <value>... [PARENT_SCOPE]) variable:变量名 value:变量的值 [PARENT_SCOPE]:可选):
如果指定,变量将被设置到父作用域中(例如在函数中定义的变量可以在函数外使用)。
在set中可以用了给变量进行设置值的操作,一般值的类似都是字符串的类型。

我们直接来看使用set完善后的结果:

cmake_minimum_required(VERSION 3.0)#指定最低cmake版本的命令
project("cmake_learn")#定义工程名称
#--------------------------------------------------------------------------------
set(SRC_LIST div.cpp mul.cpp;sub.cpp;add.cpp main.cpp)
message("SRC_LIST is " ${SRC_LIST})
add_executable(cmake_lession2 ${SRC_LIST})#定义工程生成一个可执行文件

在这里我们给变量SRC_LIST设值的值就是后面跟着的那些div.cpp mul.cpp;sub.cpp;add.cpp main.cpp,这里我们可以看到可以使用空格或者;进行分隔,这里的message就类似一个输出语句,用来打印SRC_LIST里面的内容,在cmake中我们使用变量的值都是使用${}把变量框起来,当我们执行cmake ../后的结果如下:

从这里我们可以看出我们的message语句的输出结果可以在cmake 阶段进行打印。在实际的程序中,不同的团队或者个人的一些库的路径不同,我们再写cmakelists.txt的时候这些路径也不能写死,所以变量就给了我们很大的灵活性。这个我们后面是会经常使用到的。

二_源文件搜索:

        虽然变量的引入可以帮我们优化cmakelists.txt中对于源文件的使用,但是还是需要我们去一个一个的新增源文件,还是有点麻烦的。所以我们接下来介绍如何搜索源文件:

aux_source_directory(<dir> <variable>)
命令会扫描 <dir> 目录下的所有文件,将符合 CMake 默认支持的源文件扩展名(如 .c, .cpp, .cxx, .h 等)的 ​绝对路径 存储到 <variable> 变量中。

这个时候我们就可以把set那句话替换掉,然后将我们的源文件都放在一个新建的src的文件中:

#行注释
#[[块注
释]]
cmake_minimum_required(VERSION 3.0)#指定最低cmake版本的命令
project("cmake_learn")#定义工程名称
#--------------------------------------------------------------------------------
aux_source_directory(src SRC_LIST)
message("SRC_LIST is " ${SRC_LIST})
add_executable(cmake_lession2 ${SRC_LIST})#定义工程生成一个可执行文件

#通过set函数设置编译器的版本
set(CMAKE_CXX_STANDARD 11)#增加c++11的标准 CMAKE_CXX_STANDARD是内置变量 所以可以在cmake的时候直接通过参数进行指定 cmake /path/to/cmakelists.txt -DCMAKE_CXX_STANDARD=11

然后我们重新编译,就会发现,报错了:

这是因为头文件的位置不对导致的。那么我们只需要包含下头文件即可:

include_directories(./include)

这里我们同样也是新建一个include文件然后将头文件放到include里面,然后在生成可执行文件之前加入这句话即可,完整内容如下:

#行注释
#[[块注
释]]
cmake_minimum_required(VERSION 3.0)#指定最低cmake版本的命令
project("cmake_learn")#定义工程名称
#--------------------------------------------------------------------------------
aux_source_directory(src SRC_LIST)
include_directories(./include)
message("SRC_LIST is " ${SRC_LIST})
add_executable(cmake_lession2 ${SRC_LIST})#定义工程生成一个可执行文件

#通过set函数设置编译器的版本
set(CMAKE_CXX_STANDARD 11)#增加c++11的标准 CMAKE_CXX_STANDARD是内置变量 所以可以在cmake的时候直接通过参数进行指定 cmake /path/to/cmakelists.txt -DCMAKE_CXX_STANDARD=11

三_文件搜索:

        既然说到了源文件的搜索,那么我们可以扩大点,简单来介绍下文件的搜索方式,在cmake中应该也会使用到:

# file(GLOB/GLOB_RECURSE 变量名 要搜索的文件路径和文件类型) 
GLOB:将指定目录下搜索到的满足条件的所有文件名生成一个列表,并将其存储到变量中(仅当前目录)
GLOB_RECURSE:当前目录下的所有子目录

还是使用上面那个例子,不过我们不使用aux_source_directory。具体如下(GLOB版本):

#行注释
#[[块注
释]]
cmake_minimum_required(VERSION 3.0)#指定最低cmake版本的命令
project("cmake_learn")#定义工程名称
#--------------------------------------------------------------------------------
# aux_source_directory(src SRC_LIST)
file(GLOB SRC_LIST
    "src/*.cpp"
)
include_directories(./include)
message("SRC_LIST is " ${SRC_LIST})
add_executable(cmake_lession2 ${SRC_LIST})#定义工程生成一个可执行文件

#通过set函数设置编译器的版本
set(CMAKE_CXX_STANDARD 11)#增加c++11的标准 CMAKE_CXX_STANDARD是内置变量 所以可以在cmake的时候直接通过参数进行指定 cmake /path/to/cmakelists.txt -DCMAKE_CXX_STANDARD=11

(GLOB_RECURSE 版本,可以在src目录下新增一个文件夹cpp_1,然后把src原来下的cpp文件都移动进去,这样使用GLOB的版本就会报错):

#行注释
#[[块注
释]]
cmake_minimum_required(VERSION 3.0)#指定最低cmake版本的命令
project("cmake_learn")#定义工程名称
#--------------------------------------------------------------------------------
# aux_source_directory(src SRC_LIST)
file(GLOB_RECURSE SRC_LIST
    "src/*.cpp"
)
include_directories(./include)
message("SRC_LIST is " ${SRC_LIST})
add_executable(cmake_lession2 ${SRC_LIST})#定义工程生成一个可执行文件

#通过set函数设置编译器的版本
set(CMAKE_CXX_STANDARD 11)#增加c++11的标准 CMAKE_CXX_STANDARD是内置变量 所以可以在cmake的时候直接通过参数进行指定 cmake /path/to/cmakelists.txt -DCMAKE_CXX_STANDARD=11


http://www.kler.cn/a/589503.html

相关文章:

  • 网络安全运维应急响应与溯源分析实战案例
  • 【ES6】01-ECMAScript基本认识 + 变量常量 + 数据类型
  • Java高效构建树形结构——异步加载子节点的实现方案
  • “Failed to Load SteamUI.dll” 错误详解:全面解析与高效解决方案,助你快速修复 Steam 客户端问题
  • python拉取大视频导入deepseek大模型解决方案
  • ubuntu20.04下如何防止同一类型串口设备插入USB口无法区分到底是从/dev/ttyUSB0还是/dev/ttyUSB1读取数据
  • Java 8 Stream API:传统实现和流式编程的范式对比
  • 道格拉斯-普克算法
  • Android Room 框架公共模块源码深度剖析(四)
  • linux环境安装qnn_sdk 采坑记录
  • 事件驱动架构(EDA):微服务世界的未来趋势
  • LeetCode[206]反转链表
  • MySQL连接较慢原因分析及解决措施
  • C++基础 [五] - String的模拟实现
  • FlinkCDC 达梦数据库实时同步详解
  • java,poi,提取ppt文件中的文字内容
  • LLaMA-Factory微调sft Qwen2.5-VL-7B-Instruct
  • 【etcd】
  • 【通义千问】蓝耘智算 | 智启未来:蓝耘MaaS×通义QwQ-32B引领AI开发生产力
  • 本地部署DeepSeek-R1(Dify升级最新版本、新增插件功能)