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 中搜索文件的功能解决。
随机推荐
- 【Azure Developer】如何通过Azure Portal快速获取到对应操作的API并转换为Python代码
问题描述 对于Azure资源进行配置操作,门户上可以正常操作.但是想通过Python代码实现,这样可以批量处理.那么在没有SDK的情况下,是否有快速办法呢? 问题解答 当然可以,Azure Porta ...
- sass的几种输出格式,你都知道吗
输出格式说明 Sass编译输出的CSS格式可以自定义. 有4种输出格式: :nested – 嵌套格式 :expanded – 展开格式 :compact – 紧凑格式 :compressed – 压 ...
- linux下RPM工具的使用:RPM安装/查询/查看/卸载/升级软件包
目录 一.关于软件包 二.RPM软件包 三.RPM包通用的命名规则 四.RPM工具的使用 4.1 rpm安装软件的功能 4.2 rpm查询的功能 4.3 rpm查看软件包内容是否被修改 4.4 rpm ...
- 【题解】P2627 [USACO11OPEN] Mowing the Lawn G
[题解]P2627 [USACO11OPEN] Mowing the Lawn G 题目跳转 数据量比较大,暴力肯定是不行的.只能考虑用动态规划的方式来做. 这道题有许多dp设计的思路,这里提供两个: ...
- php的下载与安装
一,进入到php的官方网站 https://www.php.net/ ,进入到下载页面: 选择 PHP 7.2.30 的Windows版本 具体的下载页面版本区分: 下载后,得到如下压缩包到如 ...
- Anaconda 虚拟环境
1. 查看虚拟环境 conda env list 2. 创建虚拟环境 conda create -n env_name python=3.8 --- env_name: 虚拟环境名 --- pytho ...
- 浅谈C#中取消令牌CancellationTokenSource
基础操作 CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); cancellationTo ...
- PaddleOCR之高性能Go语言实现OCR识别
最近为了让python语言能够直接调用PaddleOCR的C++的动态链接库,针对本人已经开源的PaddleOCR项目https://gitee.com/raoyutian/paddle-ocrsha ...
- ko编译常见问题
记录ko编译过程中遇到的常见问题: (1)找不到标准库头文件 解决方式:将lib库中的头文件链接到编译内核中.
- vue局部注册
只能在当前注册它的vue实例中使用,通过某个 Vue 实例/组件的实例选项 components 注册仅在其作用域中可用的组件 var Child = { template: '<div> ...