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}")

注意

  1. cmake 变量两边的双引号 (") 一定要加,否则不为字符串,在生成时出现问题。
  2. 双引号不需要使用反斜杠 (\) 标识转义,\" 在 CMakeLists.txt 中与 " 等价。
  3. 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 的内容

C/C++ 代码中使用 CMake 工程目录-LMLPHP
此时运行,则会打印

project path:D:/WorkSpace/CMakeTest

见图 C/C++ 代码中使用 CMake 工程目录-LMLPHP

参考链接

09-13 11:46