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


前言

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管理和构建你的项目。

  • 23
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
CMake中,可以通过`CMAKE_LIBRARY_OUTPUT_DIRECTORY`命令来指定动态库(共享库)的输出路径。具体步骤如下: 1. 在CMakeLists.txt文件中,使用`set`命令来设置`CMAKE_LIBRARY_OUTPUT_DIRECTORY`变量指定动态库输出路径。例如,假设我们希望将动态库输出到build目录下的lib文件夹中,可以在CMakeLists.txt中添加如下代码: ```cmake set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib) ``` 2. 然后,编译项目时,CMake会根据设置输出路径和目标类型自动生成动态库,并将其存储在指定输出路径下。通过以下命令进行编译: ```shell mkdir build cd build cmake .. make ``` 在编译完成后,动态库将会生成在指定输出路径下的lib文件夹内。 如果希望在多个平台上设置不同的输出路径,可以根据平台类型来进行条件判断,例如: ```cmake if(WIN32) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib/win32) elseif(APPLE) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib/macos) elseif(UNIX) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib/linux) endif() ``` 这样,根据不同平台的设置,生成的动态库将会分别输出到相应的路径下。 总之,通过在CMakeLists.txt文件中设置`CMAKE_LIBRARY_OUTPUT_DIRECTORY`变量,我们可以很方便地指定动态库的输出路径,使得生成的动态库能够按照我们的需求存储在指定的位置上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人才程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值