首页 > 其他分享 >3. set 的使用

3. set 的使用

时间:2024-07-15 10:41:05浏览次数:7  
标签:set CMake 路径 指定 C++ 使用 cpp

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

标签:set,CMake,路径,指定,C++,使用,cpp
From: https://www.cnblogs.com/kobayashilin1/p/18302665

相关文章

  • 使用Java实现WebSocket通信
    使用Java实现WebSocket通信大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨如何使用Java实现WebSocket通信,WebSocket是一种在单个TCP连接上进行全双工通信的协议,非常适合实时数据传输。1.WebSocket简介WebSocket协议在Web开发中广泛应用,......
  • 使用Spring Boot集成MyBatis
    使用SpringBoot集成MyBatis大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨如何在SpringBoot项目中集成MyBatis,实现持久化操作与数据库的交互。MyBatis是一个优秀的持久层框架,结合SpringBoot能够快速、高效地开发数据库访问功能。1.集......
  • 使用ML.NET训练一个属于自己的图像分类模型
    思维导航前言ML.NET框架介绍AI和机器学习有什么区别?ML.NET支持的.NET框架框架源代码ML.NET官方提供的使用示例ML.NET使用环境安装创建一个WinForms应用准备好需要训练的图片训练图像分类模型测试训练模型的分析效果在WinForms中调用图像分类模型项目源码地址优......
  • 使用Java实现高并发编程
    使用Java实现高并发编程大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来讨论Java中的高并发编程。Java提供了丰富的并发编程工具和框架,包括线程、线程池、并发集合和锁机制等。本文将通过代码示例详细介绍如何使用这些工具实现高并发编程。1.......
  • Simple WPF: WPF使用Windows API发送Toast通知
    最新内容优先发布于个人博客:小虎技术分享站,随后逐步搬运到博客园。创作不易,如果觉得有用请在Github上为博主点亮一颗小星星吧!以前看到Windows10的气泡通知觉得很有意思,但是一直不知道该如何实现。最近一次上网冲浪过程中偶然的机会看到了相关资料就自己来试试。本文介绍了在WPF......
  • 使用Spring Security实现安全认证
    使用SpringSecurity实现安全认证大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在这篇文章中,我将详细介绍如何使用SpringSecurity实现安全认证。通过丰富的代码示例,帮助大家全面掌握SpringSecurity的核心功能和配置方法。1.SpringSecurity概述Spri......
  • flask 定时任务(APScheduler)使用current_app app_context()上下文
    前言:描述:flask定时任务调用的方法中使用了current_app.logger.info()记录日志报错 报错代码raiseRuntimeError(unbound_message)fromNoneRuntimeError:Workingoutsideofapplicationcontext.Thistypicallymeansthatyouattemptedtousefunctionality......
  • 使用Docker部署mailcow开源邮件系统详细过程
    1.项目介绍项目网站:mailcow:dockerized–Blog根据官方介绍,这个项目名称是mailcow,名称都是小写的。下面内容是通过AI翻译自官方文档:mailcow:dockerizeddocumentationmailcow:dockerized是一个基于Docker的开源组件/电子邮件套件。mailcow依赖于许多广为人知且长期......
  • pthon中pyglet框架的使用方法
    pyglet框架的使用方法可以分为以下几个步骤:一、安装pyglet首先,需要通过pip安装pyglet。在命令行中输入以下命令:pipinstallpyglet确保Python环境配置正确,以便顺利安装pyglet库。二、创建窗口使用pyglet创建游戏窗口是游戏开发的第一步。以下是一个简单的示例代码,展......
  • pygame.display功能的使用方法
    pygame.display是Pygame库中的一个模块,它主要负责与游戏窗口的显示相关的功能。以下是对pygame.display功能的详细使用方法,按照清晰和有条理的格式进行归纳:1.初始化在使用pygame.display之前,需要先初始化Pygame。这通过pygame.init()完成,它会初始化所有Pygame模块,包括dis......