目录
CMake 使用变量和缓存来存储和管理配置信息,这对于定制构建行为和存储持久性的配置选项非常重要。下面详细介绍 CMake 中的变量和缓存的概念、用法及示例。
变量(Variables)
1. 变量的作用
变量用于存储项目构建过程中的各种信息,如源文件列表、编译选项、路径等。变量可以在 CMakeLists.txt 文件的不同位置设置和使用。
2. 变量命名
变量名称通常以大写字母开头,以区分缓存变量。不过这不是强制性的,只是一种约定。
3. 设置变量
使用 set
命令来设置变量。
cmake
深色版本
1set(VARIABLE_NAME value)
如果需要设置多个值,可以使用列表形式:
cmake
深色版本
1set(SOURCE_FILES main.cpp helper.cpp)
4. 获取变量
可以直接使用变量名来获取其值:
cmake
深色版本
1add_executable(my_executable ${SOURCE_FILES})
5. 作用域
变量有局部作用域和全局作用域。默认情况下,变量在当前 CMakeLists.txt
文件的作用域内有效。如果需要在其他 CMakeLists.txt
文件中使用,可以使用 unset
命令并带 CACHE
选项将其提升到缓存级别,使其在全局范围内可用。
cmake
深色版本
1set(MY_VARIABLE value CACHE INTERNAL "Description of variable")
6. 示例
假设我们需要设置项目的源文件列表,并在后续的命令中使用它。
cmake
深色版本
1set(SOURCE_FILES main.cpp helper.cpp)
2add_executable(my_executable ${SOURCE_FILES})
缓存(Cache)
1. 缓存的作用
缓存用于存储持久性的配置选项,这些选项通常在第一次配置项目时由用户指定,并且在整个构建过程中保持不变。缓存变量可以在后续构建中重新加载,即使重新运行 CMake。
2. 缓存变量命名
缓存变量通常以大写字母开头,并且通常在命令行中通过 -D
选项传递。
3. 设置缓存变量
使用 set
命令,并带 CACHE
关键字来设置缓存变量。
cmake
深色版本
1set(CMAKE_INSTALL_PREFIX "/usr/local" CACHE PATH "Installation prefix")
4. 获取缓存变量
直接使用变量名即可获取其值:
cmake
深色版本
1install(TARGETS my_executable DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
5. 缓存类型
缓存变量有不同的类型,常见的类型有:
PATH
: 存储路径。STRING
: 存储字符串。BOOL
: 存储布尔值。FILEPATH
: 存储文件路径。INTERNAL
: 用于内部使用的变量,不在缓存中显示。
6. 缓存变量的交互
缓存变量可以通过 CMake 的 GUI 工具(如 CMake-GUI)进行修改,也可以通过命令行参数 -D
来设置。
sh
深色版本
1cmake .. -DCMAKE_INSTALL_PREFIX="/usr/local"
7. 示例
假设我们需要设置安装路径,并在后续的安装命令中使用它。
cmake
深色版本
1set(CMAKE_INSTALL_PREFIX "/usr/local" CACHE PATH "Installation prefix")
2install(TARGETS my_executable DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
变量和缓存的差异
- 生命周期:变量在当前
CMakeLists.txt
文件的作用域内有效,而缓存变量在整个构建过程中都有效,并且可以在后续构建中重新加载。 - 用户交互:缓存变量通常由用户在第一次配置项目时指定,并且可以通过 GUI 或命令行参数进行修改;而变量通常在 CMakeLists.txt 文件内部设置和使用。
- 显示:缓存变量可以在 CMake 的 GUI 工具中显示和修改,而变量不会显示在 GUI 中。
示例:使用变量和缓存
假设我们有一个项目,需要设置源文件列表、编译选项以及安装路径,并在构建过程中使用它们。
my_project/CMakeLists.txt
cmake
深色版本
1cmake_minimum_required(VERSION 3.10)
2project(MyProject VERSION 1.0 LANGUAGES CXX)
3
4# 设置源文件列表
5set(SOURCE_FILES main.cpp helper.cpp)
6
7# 设置编译选项
8set(CMAKE_CXX_STANDARD 14)
9set(CMAKE_CXX_STANDARD_REQUIRED True)
10set(CMAKE_CXX_EXTENSIONS False)
11
12# 设置安装路径
13set(CMAKE_INSTALL_PREFIX "/usr/local" CACHE PATH "Installation prefix")
14
15# 添加可执行文件
16add_executable(my_executable ${SOURCE_FILES})
17
18# 设置头文件目录
19include_directories(include)
20
21# 安装可执行文件
22install(TARGETS my_executable DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
src/main.cpp
cpp
深色版本
1#include <iostream>
2#include "helper.h"
3
4int main() {
5 std::cout << "Hello, World!" << std::endl;
6 return 0;
7}
src/helper.h
cpp
深色版本
1#ifndef HELPER_H
2#define HELPER_H
3
4void printHelperMessage();
5
6#endif // HELPER_H
src/helper.cpp
cpp
深色版本
1#include "helper.h"
2
3void printHelperMessage() {
4 std::cout << "This is a helper function." << std::endl;
5}
构建项目
生成构建文件
sh
深色版本
1mkdir build
2cd build
3cmake .. -DCMAKE_INSTALL_PREFIX="/usr/local"
编译和构建
sh
深色版本
1make
安装
sh
深色版本
1make install
总结
通过使用 CMake 的变量和缓存,可以有效地管理项目的配置信息。变量主要用于存储临时的、局部的信息,而缓存变量则用于存储持久性的配置选项。合理地使用变量和缓存,可以使项目的构建过程更加灵活和高效。