4

我有一个用 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 项目中指定相对文件路径的好方法是什么?

4

1 回答 1

12

我不知道相对路径,但您可以使用它${CMAKE_SOURCE_DIR}来获取项目顶级目录的路径 - 主 CMakeLists.txt 文件所在的位置。

来自CMakeCMAKE_SOURCE_DIR文档:

源树顶层的路径。

这是当前 CMake 源代码树顶层的完整路径。对于源内构建,这与 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})

然后你可以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;
于 2020-01-11T01:09:58.930 回答