我对Qt和CMake完全陌生。我一直在对我的项目(cmake和qt)进行google测试,为此我需要测试两个图像的匹配情况。我有一个包含这些图像的文件夹(项目目录之外)。我想访问这些图像,但不使用绝对路径。
像这样:
imread("home/../../test_images/img1.jpg")
但是我想为images文件夹设置一个公共路径,以便以后使用我的项目的任何人都只test_image
需要相对于他们的机器设置他们的文件夹路径,而无需在代码中进行更改。
到目前为止,我已经尝试了以下方法。
1。尝试添加.qrc
资源文件并尝试访问图像。(由于images文件夹不在项目目录中,因此此操作无效。)
两种方法均无效。
我要完成的任务是:“为了避免对我使用的图像使用绝对路径,并允许尝试实现我的代码的人仅使用自己的测试图像位置在一个位置更改路径。”
编辑:寻找一种设置变量的方法,该变量eg.IMG_PATH = "/path/to/image/files"
只能设置一次,并且在整个可执行文件中仅使用该变量。因此,当有人克隆我的项目时,他们只需要IMG_PATH
使用其图像文件所在的路径来更新变量即可。这样,IMG_PATH
变量就可以在项目其余部分的任何地方进行更新。
@squareskittles给出答案后的更新:
我的项目结构:
Project_Tester
|--CMakeList.txt
|--ExecutableScript.sh.in
|--test
|---CMakeList.txt
|---sample1.cpp
|---sample2.cpp
|---main.cpp
样本1,2是具有不同测试用例的c ++文件。main.cpp运行sample.cpp文件中的所有测试,如下所示:
#include "gtest/gtest.h"
int main(int argc, char** argv)
{
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
根据@squareskittles给出的答案,我应该如何构造main.cpp以便能够使用/访问文件sample1.cpp和sample2.cpp中的变量“ IMAGES_PATH”?
有没有一种方法可以通过QT Creator单独执行,而不是通过终端运行(通过修改.sh文件内容)?
或者可以在ExecutableScript.sh.in文件中手动设置路径?
如何从项目的其他cpp文件中访问设置的变量?
为了扩展我的建议,您可以使用CMake从配置和构建项目的用户那里获取初始默认路径。CMake可以像这样从命令行获取路径,然后使用configure_file()
提供的路径来填充可执行的启动脚本。
cmake
使用这样的-D
选项运行,以填充名为的CMake变量IMAGES_PATH
:
cmake -DIMAGES_PATH=/my/path/to/imagefiles ..
configure_file()
向您添加调用以CMakeLists.txt
生成可执行的启动脚本:
...
configure_file(
${CMAKE_SOURCE_DIR}/MyExecutableStartScript.sh.in
${CMAKE_BINARY_DIR}/MyExecutableStartScript.sh @ONLY
)
该调用将读取模板文件(MyExecutableStartScript.sh.in
),并将生成一个新MyExecutableStartScript.sh
文件,将@IMAGES_PATH@
模板启动脚本中的变量替换为图像的实际路径。模板文件如下所示:
#!/bin/sh
./MyExecutable "@IMAGES_PATH@"
填充的启动脚本(运行CMake之后)将被重命名MyExecutableStartScript.sh
并包含以下内容:
#!/bin/sh
./MyExecutable "/my/path/to/imagefiles"
读取此命令行路径参数的简单C ++可执行文件可能如下所示:
#include <string>
#include <iostream>
int main(int argc, char ** argv) {
string imagesPath = "";
if( argc == 2 ) {
imagesPath = argv[1];
} else {
std::cout << "Usage: ./MyExecutable /path/to/images" << std::endl;
return 1;
}
...
}
生成可执行文件后,可以通过手动修改生成的启动脚本轻松更改图像的路径。最重要的是,此示例允许您在开始时设置一次默认位置,但是您也不需要重新构建代码即可更改图像文件路径。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句