如何获取 CMake 单元测试的相对路径?

How to get a relative path for CMake unit tests?

我有一个用 CMake 构建的项目,它使用 Catch2 进行单元测试。一些单元测试练习代码从这样的文件加载数据:

std::string resource_dir = "TEST_CWD/resources/";
std::ifstream infile{resource_dir + "datafile.txt"}

问题是如何正确获取TEST_CWD的值。

目录结构很简单(并非一成不变):

my_project/
    test/
        resources/datafile.txt
        loader_test.cpp

TEST_CWD 留空有时可行,但当 运行 通过 IDE 测试时会中断。使用绝对路径设置环境变量也可以,但会在其他机器上中断。同样强制所有用户手动设置环境变量是用户不友好的。

在 CMake 项目中指定相对文件路径的好方法是什么?

我不知道相对路径,但您可以使用 ${CMAKE_SOURCE_DIR} 获取项目 top-level 目录的路径——主 CMakeLists.txt 文件位于.

来自 CMake docs for CMAKE_SOURCE_DIR:

The path to the top level of the source tree.

This is the full path to the top level of the current CMake source tree. For an in-source build, this would be the same as CMAKE_BINARY_DIR.

然后你就可以把所有的路径都以此为基础。例如,在 CMake 脚本中,您可以编写 ${CMAKE_SOURCE_DIR}/resources/datafile.txt.

编辑:

如果您需要在 C++ 代码本身中访问此值,可以使用 configure_file 命令。例如,您可以创建一个名为 Config.h.in...

的文件
// Config.h.in

#ifndef CONFIG_H
#define CONFIG_H

#define SOURCE_DIR "${CMAKE_SOURCE_DIR}"

#endif

... 然后在您的 CMakeLists.txt 文件中,

configure_file(Config.h.in ${CMAKE_BINARY_DIR}/Config.h)

include_directories(${CMAKE_BINARY_DIR})

然后您可以像正常 header 一样包含 Config.h,然后开始吧!

单变量快捷方式

只需使用预处理器宏。在 CMakeLists.txttest/:

target_compile_definitions(target_name PUBLIC TEST_RESOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}/resources/")

在 C++ 中:

std::string resource_dir = TEST_RESOURCE_DIR;