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. Hugging Face 与 Wiz Research 合作提高人工智能安全性

    我们很高兴地宣布,我们正在与 Wiz 合作,目标是提高我们平台和整个 AI/ML 生态系统的安全性. Wiz 研究人员 与 Hugging Face 就我们平台的安全性进行合作并分享了他们的发现. W ...

  2. java学习之旅(day.21)

    HTML 初识HTML HTML: Hyper Text Markup Language(超文本标记语言) 超文本包括文字.图片.音频.视频.动画等 W3C标准 W3C :World Wide Web ...

  3. 更智能!AIRIOT加速煤炭行业节能减排升级

    "双碳政策"下,各个行业都在践行节能减排行动,依靠数字化.智能化手段开展节能减排工作. 煤炭行业是能源消耗大户,煤炭选洗是煤炭行业节能减排的重要环节之一,加强煤炭清洁高效利用工作, ...

  4. RocketMQ消息过滤机制源码详解

    #RocketMQ提供了2种消息过滤的方式: TAG 过滤 SQL92 过滤 SQL过滤默认是没有打开的,如果想要支持,必须在broker的配置文件中设置:enablePropertyFilter = ...

  5. ceph客户端配置自动挂载存储服务

    1. 安装支持ceph的内核模块 可选: centos/ubuntu: yum install -y ceph-common 或 apt install -y ceph-common 2. 拷贝认证密 ...

  6. 003. git标签

    git标签 标签用于记录详细修改内容,为后续使用提供帮助. 也方便快速的回滚. 每一次提交[commit]都可以打一个tag标签. 测试阶段标签规则: 以 0.01 0.02版本为主 正式上线标签规则 ...

  7. 和必应对话之mysql分区分表

    mysql单表数据量太大 导致查询缓慢问题如何解决 您好,这是Bing.根据网络搜索结果,mysql单表数据量太大导致查询缓慢的问题有以下几种可能的解决方案: 使用索引.索引是一种数据结构,可以帮助数 ...

  8. Python缺失值处理实现

      在数据处理相关工作中,读取的数据中常常会有缺失值的情况,为顺利进行后续的操作,需要首先对缺失值进行处理,处理的方式一般为删除或填充,Python中提供了专门的工具包,可以方便地进行实现.读取操作可 ...

  9. 此计算机上不存在虚拟机管理服务(VMMS)。请确保已启用“Hyper-V 服务”功能。

    此计算机上不存在虚拟机管理服务(VMMS).请确保已启用"Hyper-V 服务"功能. 解决方法: 在主板BIOS 里开启VT. Intel Virtualization Tech ...

  10. C#.NET 简单使用log4net

    1.nuget 中安装log4net 2.添加一个配置文件"log4net2.config",内容如下: <?xml version="1.0" enco ...