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

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

相关文章:

  • 为什么在域名注册后还需要进行解析?
  • 大模型时代:主流训练、微调、推理与部署框架深度解析及对比
  • Spring设计模式 八股速记 高层模块底层模块 依赖倒置原则 开闭原则 接口隔离原则
  • 洛谷每日1题-------Day22__P1421 小玉买文具
  • 技术债务的隐患:何时重构,何时妥协?
  • 【认知框架重构】
  • 【R语言】FetchData函数:处理单细胞数据的灵活高效工具
  • 实验篇| Nginx环境搭建-安全配置
  • Linux:(socket套接字——TCP协议)
  • 乐凡R10U系列新品发布:极致轻薄与算力突破,定义行业终端新标杆
  • NetCore实现RTSPServer(包含交互及推流)
  • 中间件漏洞之weblogic
  • 软件测试--如何使用har2case和HttpRunner + Allure生成测试报告
  • 网络爬虫【爬虫库urllib】
  • 车载通信架构 --- UB位更新策略记录
  • 【Python学习笔记】一些关于多线程,xls文件读取,PyQt5,PyInstaller打包等问题的解决方案记录
  • <link>标签在网页中的常见用途及与<script>标签引入资源方式的区别
  • Inno Setup打包脚本区分Windows系统版本
  • Proser:重大更新,新增数据检视功能
  • 使用 Arduino 和 Wi-Fi 的 Web 控制伺服
  • 被围观的“英之园”,谁建了潮汕天价违建?
  • 六省会共建交通枢纽集群,中部六省离经济“第五极”有多远?
  • 白玉兰奖征片综述丨海外剧创作趋势观察:跨界·融变·共生
  • 商务部:中方将适时发布中美经贸磋商相关消息
  • 缅甸内观冥想的历史漂流:从心理治疗室到“非语言现场”
  • 党建评:对违规宴饮等问题要坚决露头就打