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. java学习之旅(day.07)

    面向对象编程(oop) 面向过程思想:线性思维 步骤清晰简单,每一步做什么很明确 适合处理较为简单地问题 面向对象思想:总分 抽象 属性+方法=类 分类的思维模式,思考问题首先会解决问题需要哪些分类, ...

  2. Excel功能学习

    字符串和单元格内容拼接函数CONCATENATE a@马踏星空:=CONCATENATE(D2,E2,F2)拼接指定单元格内字符串,无分隔符 a@马踏星空:=CONCATENATE(I4," ...

  3. 日常Bug排查-偶发性读数据不一致

    日常Bug排查-偶发性读数据不一致 前言 日常Bug排查系列都是一些简单Bug的排查.笔者将在这里介绍一些排查Bug的简单技巧,同时顺便积累素材. Bug现场 业务场景 先描述这个问题出现的业务场景. ...

  4. 【论文阅读】VulCNN受图像启发的可扩展漏洞检测系统

    基本信息 摘要 由于深度学习(DL)可以自动从源代码中学习特征,因此已被广泛用于源代码漏洞检测.为了实现可扩展的漏洞扫描,一些先前的研究打算通过将源代码视为文本来直接处理源代码.为了实现准确的漏洞检测 ...

  5. 微信小程序订阅消息开发指南(java)

    微信小程序订阅消息开发指南(java) 第一步 准备阶段 1.你得有一个小程序,并且认证了,个人的也行 2.开通订阅消息 小程序后台->功能->订阅消息 3.公共模板库选择一个模板 选择的 ...

  6. 基于webapi的websocket聊天室(番外一)

    上一篇我已经实现了聊天室,并且在协议中实现了4种类型的消息传输.其实还可以添加video,audio,live等等类型. 不过假如把目前的协议看作RCP1.0版的话,这个版本就只支持有限的4种消息.精 ...

  7. docker --link容器互联

    目录 一.系统环境 二.docker容器互联概述 2.1 docker容器互联的三种方式 2.2 docker --link使用注意事项 2.3 docker --link原理 三.docker容器互 ...

  8. Qt-FFmpeg开发-保存视频流裸流(11)

    音视频/FFmpeg #Qt Qt-FFmpeg开发-保存视频流裸流 目录 音视频/FFmpeg #Qt Qt-FFmpeg开发-保存视频流裸流 1.概述 2.实现效果 3.FFmpeg保存裸流代码流 ...

  9. 通过钩子函数+Traceid实现Flask链路追踪

    背景 在flask web中我们通常需要一个traceid作为调用参数传递给全链路各个调用函数 需要针对一次请求创建一个唯一的traceid:这里用uuid去简化代替 我们需要保证traceid不被污 ...

  10. grid 布局兼容性问题

    低版本的安卓机上是不生效的 代码 .grid_4 { display: grid; grid-template-columns: repeat(4, 1fr); grid-template-rows: ...