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 中搜索文件的功能解决。

随机推荐

  1. LOTO示波器软件PC缓存(波形录制与回放)功能

    当打开PC缓存功能后, 软件将采用先进先出的原则排队对示波器采集的每一帧数据, 进行帧缓存. 当发现屏幕中有感兴趣的波形掠过时, 鼠标点击软件的(暂停)按钮, 可以选择回看某一帧的波形.一帧数据的量  ...

  2. 【超强SQL】WordPress批量修改指定分类下所有文章状态

    前阵子主题君的某一个手游下载站的某一个分类,被百度K了,导致整个分类的文章收录都没了,这时候如果想要回复权重,就需要把这个分类的文章都删除了. 下面主题君给大家分享一段巨牛逼的SQL, WordPre ...

  3. Android 13 - Media框架(4)- MediaPlayerService

    关注公众号免费阅读全文,进入音视频开发技术分享群! MediaPlayerService是android的多媒体框架的核心服务之一,该服务存储有android平台所支援的编解码器信息,管理所有通过Me ...

  4. 神经网络常见参数解释:epoch、batch、batch size、step、iteration

      本文介绍在机器学习.深度学习的神经网络模型中,epoch.batch.batch size.step与iteration等名词的具体含义.   epoch:表示将训练数据集中的所有样本都过一遍(且 ...

  5. Qt_Demo_1:实现一个简易的记事本

    1  环境: 系统:windows 10 代码编写运行环境:Qt Creator 4.4.1 (community) GitHub:https://github.com/zhengcixi/Qt_De ...

  6. pandas基础--汇总和计算描述统计

    pandas含有是数据分析工作变得更快更简单的高级数据结构和操作工具,是基于numpy构建的. 本章节的代码引入pandas约定为:import pandas as pd,另外import numpy ...

  7. 随机化 base64 加密

    随机化 base64 加密 项目原址:Jeefy / jtim-enc · GitLab 技术 采用双重随机化技术. 第一重随机化是利用固定的随机种子改变 base64 解码的映射数组. 第二重随机化 ...

  8. C#.NET 逐行读取TXT文本

    C#.NET 逐行读取TXT文本 using System; using System.IO; class Program { static void Main() { string filePath ...

  9. 夜莺项目发布 v6.1.0 版本,增强可观测性数据串联

    大家好,夜莺项目发布 v6.1.0 版本,这是一个中版本迭代,不止是 bugfix 了,而是引入了既有功能的增强.具体增强了什么功能,下面一一介绍. 1. 增强可观测性数据串联 从 v6.1.0 开始 ...

  10. 前端使用 Konva 实现可视化设计器(14)- 折线 - 最优路径应用【代码篇】

    话接上回<前端使用 Konva 实现可视化设计器(13)- 折线 - 最优路径应用[思路篇]>,这一章继续说说相关的代码如何构思的,如何一步步构建数据模型可供 AStar 算法进行路径规划 ...