C/C++ 代码中使用 CMake 工程目录
使用原因
在 C++ 代码中获取工程路径有点繁琐,因为如果生成的可执行文件(.exe) 位置与工程目录不同,则当前的路径为运行时的路径,可能需要通过很多的 ../..
来定位到工程目录,甚至由于权限问题运行目录在 C 盘系统路径,以及由于迭代更新生成路径发生变化…
如果调试使用工程路径下的文件,比如配置文件时,在每次修改配置文件后,都需要将配置文件进行拷贝更新到运行目录下才能调试,虽然 CMake 也提供指令用于拷贝文件(如 file),但依旧很繁琐。
如何使用
需要用到 CMake 中的变量 PROJECT_SOURCE_DIR,此变量的内容为当前目录或其父目录范围中最后一次调用 project()
命令的 CMakeLists.txt 所在目录。
在工程只有一个单一目录时,也可以使用 CMAKE_CURRENT_SOURCE_DIR,或 CMAKE_SOURCE_DIR 变量
首先来创建一个简单的 CMakeLists.txt
# 设置 CMake 最低版本要求
cmake_minimum_required(VERSION 3.0)
# 设置使用 C++ 标准为 C++17
set(CMAKE_CXX_STANDARD 17)
# 创建工程,设置工程名称 CMakeTest
project(CMakeTest)
# 规定头文件的包含路径
include_directories(${PROJECT_SOURCE_DIR})
# 生成可执行文件 只包含一个 main.cpp 文件
add_executable(${PROJECT_NAME} main.cpp)
# 创建我们的宏 PROJECT_PATH
add_definitions(-DPROJECT_PATH="${PROJECT_SOURCE_DIR}")
注意:
- cmake 变量两边的双引号 (
"
) 一定要加,否则不为字符串,在生成时出现问题。 - 双引号不需要使用反斜杠 (
\
) 标识转义,\"
在 CMakeLists.txt 中与"
等价。 - cmake 变量使用需要加上花括号,并前置
$
符号
然后写主 cpp 文件
#include <iostream>
#include <string>
int main(int argc, char* argv[])
{
std::string path(PROJECT_PATH);
std::cout << "project path:" << path << std::endl;
return 0;
}
在同一目录下创建 build 目录,用于创建 CMake 生成文件和工程文件等。接下来生成工程
cd build
cmake ..
使用 Visual Studio 打开 build 目录下的 .sln文件 (解决方案文件 Solution),此时将鼠标放在宏上方即可看到此宏已被扩展为了 PROJECT_SOURCE_DIR 的内容
此时运行,则会打印
project path:D:/WorkSpace/CMakeTest
见图
参考链接
- CMake 官网 PROJECT_SOURCE_DIR 变量https://cmake.org/cmake/help/latest/variable/PROJECT_SOURCE_DIR.html#variable:PROJECT_SOURCE_DIR
- CMake 官网 cmake 变量
https://cmake.org/cmake/help/latest/manual/cmake-variables.7.html