C++ 如何将图像文件夹添加到CMake项目中,以便在c++;可执行文件?
我对Qt和CMake完全陌生。我一直在对我的项目(cmake和qt)进行谷歌测试,我需要测试两幅图像的匹配情况。我有一个文件夹(在项目目录之外)包含这些图像。我想访问这些图像,但不使用绝对路径 大概是这样的:C++ 如何将图像文件夹添加到CMake项目中,以便在c++;可执行文件?,c++,qt,cmake,googletest,C++,Qt,Cmake,Googletest,我对Qt和CMake完全陌生。我一直在对我的项目(cmake和qt)进行谷歌测试,我需要测试两幅图像的匹配情况。我有一个文件夹(在项目目录之外)包含这些图像。我想访问这些图像,但不使用绝对路径 大概是这样的: imread("home/../../test_images/img1.jpg") #!/bin/sh ./MyExecutable "@IMAGES_PATH@" #include <string> #include <iostream> int main
imread("home/../../test_images/img1.jpg")
#!/bin/sh
./MyExecutable "@IMAGES_PATH@"
#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;
}
...
}
但是我想为images文件夹设置一个公共路径,这样以后使用我的项目的任何人都只需设置他们的test\u image
文件夹路径,而不需要更改代码
到目前为止,我已经尝试了以下方法
一,。尝试添加.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
我的项目结构:
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\u PATH”
在程序设置中定义图片路径。需要时,使用该类存储(持久化)和检索程序设置。您可能希望使用QDialog来编辑程序设置。是便携式应用程序的一个例子。在程序设置中定义图片路径。需要时,使用该类存储(持久化)和检索程序设置。您可能希望使用QDialog来编辑程序设置。是一个便携式应用程序的例子。要扩展我的建议,您可以使用CMake从配置和构建项目的用户获取初始默认路径。CMake可以像这样从命令行获取路径,然后使用提供的路径填充可执行的启动脚本 像这样使用
-D
选项运行cmake
,以填充名为IMAGES\u PATH
的cmake变量:
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\u PATH@
变量替换为图像的实际路径。模板文件的外观如下所示:
imread("home/../../test_images/img1.jpg")
#!/bin/sh
./MyExecutable "@IMAGES_PATH@"
#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;
}
...
}
填充的启动脚本(在运行CMake后)将重命名为MyExecutableStartScript.sh,并包含以下内容:
#!/bin/sh
./MyExecutable "/my/path/to/imagefiles"
一个简单的C++可执行的读取这个命令行路径的参数可以是这样的:
imread("home/../../test_images/img1.jpg")
#!/bin/sh
./MyExecutable "@IMAGES_PATH@"
#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;
}
...
}
#包括
#包括
int main(int argc,字符**argv){
字符串imagesPath=“”;
如果(argc==2){
imagesPath=argv[1];
}否则{
std::cout要扩展我的建议,可以使用CMake从配置和构建项目的用户获取初始默认路径。CMake可以像这样从命令行获取路径,然后使用提供的路径填充可执行的开始脚本
像这样使用-D
选项运行cmake
,以填充名为IMAGES\u PATH
的cmake变量:
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\u PATH@
变量替换为图像的实际路径。模板文件如下所示:
imread("home/../../test_images/img1.jpg")
#!/bin/sh
./MyExecutable "@IMAGES_PATH@"
#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;
}
...
}
填充的启动脚本(在运行CMake后)将重命名为MyExecutableStartScript.sh,并包含以下内容:
#!/bin/sh
./MyExecutable "/my/path/to/imagefiles"
一个简单的C++可执行的读取这个命令行路径的参数可以是这样的:
imread("home/../../test_images/img1.jpg")
#!/bin/sh
./MyExecutable "@IMAGES_PATH@"
#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;
}
...
}
#包括
#包括
int main(int argc,字符**argv){
字符串imagesPath=“”;
如果(argc==2){
imagesPath=argv[1];
}否则{
std::非常感谢您的回复。我检查了您的示例。但我并不期待提供任何形式的UI。我正在寻找一种方法来做一些简单的事情,例如,设置一个变量,例如IMG_PATH=“/PATH/to/image/files”它可以设置一次,并且只有变量在所有可执行文件中使用。因此,当有人克隆我的项目时,他们只需使用其图像文件所在的路径更新IMG_路径变量。因此,现在IMG_路径变量将在项目的其余部分的每个位置更新