3. set 的使用
3. set 的使用
因为在实际工程中,我们不会将具体文件全部写出来,这是一件费力不讨好的事情。
3.1 set 定义变量
在 CMake 文件中,默认的变量数据类型是字符串,如果要用别的类型,需要进行转换
在上面的例子中一共提供了 5 个源文件,假设这 5 个源文件需要反复被使用,每次都直接将它们的名字写出来确实是很麻烦,此时我们就需要定义一个变量,将文件名对应的字符串存储起来,在 CMake 里定义变量需要使用 set。
3.1.1 定义文件列表
set 的语法:
# SET 指令的语法是:
# [] 中的参数为可选项, 如不需要可以不写
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
VAR:变量名VALUE:变量值
使用示例:
# 方式1:各个源文件之间使用空格间隔
# set(SRC_LIST main.cpp div.cpp sub,cpp mul.cpp add.cpp)
# 方式2:各个源文件之间使用分号 ; 间隔
set(SRC_LIST main.cpp;div.cpp;sub,cpp;mul.cpp;add.cpp)
add_executable(calc ${SRC_LIST})
3.1.2 指定C++标准
在编写 C++ 程序的时候,可能会用到 C++11、C++14、C++17、C++20 等新特性,那么就需要在编译的时候在编译命令中制定出要使用哪个标准:
g++ *.cpp -std=c++11 -o app
C++标准对应有一宏叫做 DCMAKE_CXX_STANDARD 。在 CMake 中想要指定 C++ 标准有两种方式:
在 CMakeLists 中通过
set指定:set(CMAKE_CXX_STANDARD 17) # 增加-std=c++17
set(CMAKE_CXX_STANDARD 20) # 增加-std=c++20
在执行 cmake 命令时候指定:
-DXXX后面的XXX就是具体的宏,前面的D表示它是一个宏,它在生成 makefile 的时候,会在里面添加上我们指定的版本信息# 增加 -std=c++11
cmake -DCMAKE_CXX_STANDARD=11
某些编译器版本较低,默认指定的标准为 C++98,这时候我们最好在 CMakeLists 中指定标准。
3.1.3 指定输出的路径
在 CMake 中指定可执行程序输出的路径,也对应一个宏,叫做 EXECUTABLE_OUTPUT_PATH,它的值还是通过set 命令进行设置:
# set(HOME /home/yuzu/cmake_proj/proj2)
set(HOME ${CMAKE_CURRENT_SOURCE_DIR}) # 获取当前CMakeLists.txt 的路径,赋给HOME
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)
- 第一行:定义一个变量用于存储一个绝对路径(在这里不起作用)
- 第二行:获取当前CMakeLists.txt 的路径,赋给变量
HOME - 第三行:将拼接好的路径值设置给
EXECUTABLE_OUTPUT_PATH宏
如果这个路径中的子目录不存在,会自动生成,无需自己手动创建
此时我们手动调用 make ,则会在 bin 目录下生成一个可执行文件 calc
tree bin
bin
└── calc
0 directories, 1 file
上述命令可以给动态库指定生成路径,但是一般不这么做,指定动态库生成路径有另一个宏,为:
LIBRARY_OUTPUT_PATH,用法和EXECUTABLE_OUTPUT_PATH相似
set 比较灵活,可以给自定义变量设置值,也可以获取宏的值。
但是上面的 CMake 设置还是没有解决本质上的问题,因为我们还是要把源文件中的文件都列出来,在这里我们可以使用 CMake 中搜索文件的功能解决。
随机推荐
- python的requests模块详解
原文链接:https://www.cnblogs.com/lanyinhao/p/9634742.html 1.模块说明 requests是使用Apache2 licensed 许可证的HTTP库. ...
- minio 安装
mybatis 相关:https://baomidou.com/pages/223848/#fieldfillhttps://mybatis-flex.com/zh/intro/maven.html ...
- 异构数据源同步之数据同步 → datax 再改造,开始触及源码
开心一刻 其实追女生,没那么复杂 只要你花心思,花时间,陪她聊天,带她吃好吃的,耍好玩的,买好看的 慢慢你就会发现什么叫做 打水漂 不说了,我要去陪她看电影了 前情回顾 异构数据源同步之数据同步 → ...
- HTML——input之单选按钮
在 HTML 中,把 <input> 标签的 type 属性设置为 radio 可以表示单选按钮.具体语法格式如下: <input type="radio" /& ...
- HTML——table表格标签
一.table表格的完整写法 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- 【论文笔记】轻量级网络MobileNet
[深度学习]总目录 MobileNet V1:<MobileNets: Efficient Convolutional Neural Networks for MobileVision Appl ...
- uniapp 组件使用
组件使用情况:页面出现多个相似的页面这个时候我们就可以把公共的页面进行封装,避免冗余的代码 1. compoents 目录下新建组件,名称随意[案例就叫 newsList]2. 开始封装需要多次使用的 ...
- Linux间进程通信--消息队列
本系列文章主要是学习记录Linux下进程间通信的方式. 常用的进程间通信方式:管道.FIFO.消息队列.信号量以及共享存储. 参考文档:<UNIX环境高级编程(第三版)> 参考视频:Lin ...
- vue devtools工具安装 Vue实现数据绑定的原理
通过chrome中的谷歌插件商店安装Vue Devtools工具,此工具帮助我们进行vue数据调试所用,一定要安装. https://chrome.google.com/webstore?utm_so ...
- C# .NET6 .NET CORE EXCEL 导入和导出
使用NPOI导入.xlsx遇到"EOF in header"报错,网上找好很多方法,没解决,最后换成EPPlus.Core导入. 导出默认是.xls. NPOI 操作类: usin ...