如何获取 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.txt
中 test/
:
target_compile_definitions(target_name PUBLIC TEST_RESOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}/resources/")
在 C++ 中:
std::string resource_dir = TEST_RESOURCE_DIR;
我有一个用 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.txt
中 test/
:
target_compile_definitions(target_name PUBLIC TEST_RESOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}/resources/")
在 C++ 中:
std::string resource_dir = TEST_RESOURCE_DIR;