【CMake保姆级教程】定义变量、指定C++标准、指定输出路径

举报
人才程序员 发表于 2024/01/29 08:22:06 2024/01/29
【摘要】 @TOC 前言CMake是一个强大的构建工具,它通过简化项目的构建和配置过程,使得跨平台开发变得更加容易。CMake使用简洁的语法和自动生成的构建文件,可以帮助开发者更轻松地管理和组织项目。在本教程中,我们将学习如何使用CMake定义变量、指定C++标准以及指定输出路径。 一、变量 1.1 为什么需要变量?在CMake中,变量是存储数据的容器,它们用于传递信息、控制流程,以及配置构建过程。定...

@TOC


前言

CMake是一个强大的构建工具,它通过简化项目的构建和配置过程,使得跨平台开发变得更加容易。CMake使用简洁的语法和自动生成的构建文件,可以帮助开发者更轻松地管理和组织项目。在本教程中,我们将学习如何使用CMake定义变量、指定C++标准以及指定输出路径。


一、变量

1.1 为什么需要变量?

在CMake中,变量是存储数据的容器,它们用于传递信息、控制流程,以及配置构建过程。定义变量可以提高代码的可读性和可维护性,同时也方便在不同的地方共享相同的信息。通过变量,我们可以轻松地调整配置选项、文件路径等,从而适应不同的开发环境和需求。

1.2 set的使用

# SET 指令的语法是:
# [] 中的参数为可选项, 如不需要可以不写
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])

在一个文件夹中,我们有下面这些文件

.
├── build
├── CMakeLists.txt
├── func.c
├── func.h
└── main.c

这2个源文件需要反复被使用,每次都直接将它们的名字写出来确实是很麻烦,此时我们就需要定义一个变量,将文件名对应的字符串存储起来,在cmake里定义变量需要使用set。

set(SRC_LIST main.c func.c)

比如像上面这样,前面为变量名,后面为你要赋的值

1.3 使用变量

如果你想使用变量,你需要这样${变量名}
如下所示:

cmake_minimum_required(VERSION 3.0.0)
project(test)

set(SRC_LIST main.c func.c)

add_executable(app ${SRC_LIST})
ubuntu@ubuntu-2204:~/C/csdn-cmake$ cd build/
ubuntu@ubuntu-2204:~/C/csdn-cmake/build$ cmake ..
-- The C compiler identification is GNU 11.4.0
-- The CXX compiler identification is GNU 11.4.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/ubuntu/C/csdn-cmake/build
ubuntu@ubuntu-2204:~/C/csdn-cmake/build$ make
[ 33%] Building C object CMakeFiles/app.dir/main.c.o
[ 66%] Building C object CMakeFiles/app.dir/func.c.o
[100%] Linking C executable app
[100%] Built target app
ubuntu@ubuntu-2204:~/C/csdn-cmake/build$ ./app
Hello CMake
ubuntu@ubuntu-2204:~/C/csdn-cmake/build$ 

可以看到,成功的cmake和make了

二、指定C++标准

2.1 为什么需要指定C++标准?

指定C++标准是为了确保项目在不同的编译器和平台上都能正确编译和运行。不同的C++标准包含了不同的语法和特性,开发者需要根据项目的需要选择合适的标准。通过在CMake中指定C++标准,我们可以保证代码在各种环境中的一致性。

2.2 指定使用的C++标准

在编写C++程序的时候,可能会用到C++11、C++14、C++17、C++20等新特性,那么就需要在编译的时候在编译命令中制定出要使用哪个标准:

$ g++ *.cpp -std=c++11 -o app

上面的例子中通过参数-std=c++11指定出要使用c++11标准编译程序,C++标准对应有一宏叫做DCMAKE_CXX_STANDARD。在CMake中想要指定C++标准有两种方式:
在 CMakeLists.txt 中通过 set 命令指定

#增加-std=c++11
set(CMAKE_CXX_STANDARD 11)
#增加-std=c++14
set(CMAKE_CXX_STANDARD 14)
#增加-std=c++17
set(CMAKE_CXX_STANDARD 17)
在执行 cmake 命令的时候指定出这个宏的值
#增加-std=c++11
cmake CMakeLists.txt文件路径 -DCMAKE_CXX_STANDARD=11
#增加-std=c++14
cmake CMakeLists.txt文件路径 -DCMAKE_CXX_STANDARD=14
#增加-std=c++17
cmake CMakeLists.txt文件路径 -DCMAKE_CXX_STANDARD=17

就像下面这样:

ubuntu@ubuntu-2204:~/C/csdn-cmake/build$ cmake ../CMakeLists.txt -DCMAKE_CXX_STANDARD=11
-- The C compiler identification is GNU 11.4.0
-- The CXX compiler identification is GNU 11.4.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/ubuntu/C/csdn-cmake
ubuntu@ubuntu-2204:~/C/csdn-cmake/build$

三、指定输出路径

3.1 为什么需要指定输出路径?

指定输出路径可以让我们更好地组织项目的构建结果。默认情况下,CMake会将可执行文件和库放在项目的构建目录中,但在实际项目中,我们可能希望将这些文件放在特定的文件夹中,以便更好地组织项目结构。

3.2 设置输出路径

在CMake中指定可执行程序输出的路径,也对应一个宏,叫做EXECUTABLE_OUTPUT_PATH,它的值还是通过set命令进行设置:

文件夹层级如下:

ubuntu@ubuntu-2204:~/C/csdn-cmake$ tree -L 1
.
├── bin
├── build
├── CMakeLists.txt
├── func.cpp
├── func.h
└── main.cpp

2 directories, 4 files
set(HOME /home/ubuntu/C/csdn-cmake/)
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)

第一行:定义一个变量用于存储一个绝对路径
第二行:将拼接好的路径值设置给EXECUTABLE_OUTPUT_PATH宏
如果这个路径中的子目录不存在,会自动生成,无需自己手动创建
由于可执行程序是基于 cmake 命令生成的 makefile 文件然后再执行 make 命令得到的,所以如果此处指定可执行程序生成路径的时候使用的是相对路径 ./xxx/xxx,那么这个路径中的 ./ 对应的就是 makefile 文件所在的那个目录。

在这里插入图片描述
我们通过cmake和make就可以生成可执行程序了,如图所示


总结

通过本教程,我们学习了如何在CMake中定义变量、指定C++标准以及指定输出路径。这些功能使得项目的配置和构建变得更加简便和灵活。变量提供了一种在不同地方共享信息的方式,指定C++标准确保了项目在不同平台上的一致性,而指定输出路径则使得项目的构建结果更加有条理。希望这些知识能够帮助你更好地使用CMake管理和构建你的项目。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。