[英]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}
来获取项目顶级目录的路径 - 主 CMakeLists.txt 文件所在的位置。
来自CMAKE_SOURCE_DIR
的CMake 文档:
源树顶层的路径。
这是当前 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
,然后就可以了!
单变量快捷方式
只需使用预处理器宏。 在test/
的CMakeLists.txt
中:
target_compile_definitions(target_name PUBLIC TEST_RESOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}/resources/")
在 C++ 中:
std::string resource_dir = TEST_RESOURCE_DIR;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.