Ada*_*dam 0 c++ unit-testing cmake catch2
我有一个使用 CMake 构建的项目,它使用 Catch2 进行单元测试。一些单元测试练习从文件加载数据的代码,如下所示:
std::string resource_dir = "TEST_CWD/resources/";
std::ifstream infile{resource_dir + "datafile.txt"}
Run Code Online (Sandbox Code Playgroud)
问题是如何正确获取 的值TEST_CWD。
目录结构很简单(并不是一成不变的):
my_project/
test/
resources/datafile.txt
loader_test.cpp
Run Code Online (Sandbox Code Playgroud)
留空TEST_CWD有时会起作用,但在通过 IDE 运行测试时会中断。使用绝对路径设置环境变量也可以,但在其他机器上会崩溃。同样,强制所有用户手动设置环境变量也是用户不友好的。
在 CMake 项目中指定相对文件路径的好方法是什么?
我不知道相对路径,但您可以用来${CMAKE_SOURCE_DIR}获取项目的顶级目录的路径 - 主 CMakeLists.txt 文件所在的位置。
来自CMake文档CMAKE_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
Run Code Online (Sandbox Code Playgroud)
...然后在您的 CMakeLists.txt 文件中,
configure_file(Config.h.in ${CMAKE_BINARY_DIR}/Config.h)
include_directories(${CMAKE_BINARY_DIR})
Run Code Online (Sandbox Code Playgroud)
然后您可以Config.h像普通标头一样添加,然后就可以开始了!
单变量快捷方式
只需使用预处理器宏即可。在CMakeLists.txt中test/:
target_compile_definitions(target_name PUBLIC TEST_RESOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}/resources/")
Run Code Online (Sandbox Code Playgroud)
在 C++ 中:
std::string resource_dir = TEST_RESOURCE_DIR;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1335 次 |
| 最近记录: |