如何将图像文件夹添加到 CMake 项目以便在 C++ 可执行文件中使用这些图像?
How to add an images folder to CMake project in order to use those images in the c++ executables?
我对 Qt 和 CMake 完全陌生。我一直在对我的项目(cmake 和 qt)进行 google 测试,为此我需要测试两个图像的匹配。我有一个包含这些图像的文件夹(在项目目录之外)。我想访问这些图片,但不使用绝对路径。
像这样:
imread("home/../../test_images/img1.jpg")
但我想为图像文件夹设置一个通用路径,这样以后使用我的项目的任何人都只需要根据他们的机器设置他们的 test_image
文件夹路径,而不需要进行更改在代码中。
到目前为止我已经尝试了以下方法。
1。尝试添加 .qrc
资源文件并尝试访问图像。 (这不起作用,因为图像文件夹在项目目录之外。)
- 试图在 QT 构建环境设置中设置路径变量。
None 两种方法都有效。
我想要完成的事情:"To be able to avoid using an absolute path for the images I use and allow people trying to implement my code to only change the path at one place with their own test image locations."
编辑:
寻找一种设置变量 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 ,以便能够 use/access 变量 "IMAGES_PATH"在文件 sample1.cpp 和 sample2.cpp ?
有没有一种方法可以单独从 QT Creator 完成,而不是 运行 从终端完成?(通过修改 .sh 文件内容)?
或者可以在ExecutableScript.sh.in文件中手动设置路径吗?
如何从项目的其他 cpp 文件访问设置的这个变量?
在程序设置中定义图片路径。使用 QSettings class to store (persist) and retrieve your program settings when needed. You may want to provide your uses with a QDialog to edit your program settings. Here 是便携式应用程序的一个例子。
为了扩展我的建议,您可以使用 CMake 从用户配置和构建项目中获取初始默认路径。 CMake 可以像这样从命令行获取路径,然后使用 configure_file()
使用提供的路径填充可执行启动脚本。
运行 cmake
使用 -D
选项来填充名为 IMAGES_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_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;
}
...
}
生成可执行文件后,可以通过手动修改生成的启动脚本轻松更改图像的路径。最重要的是,此示例允许您在开始时设置一次默认位置,但您也不需要重新构建代码来更改图像文件路径。
我对 Qt 和 CMake 完全陌生。我一直在对我的项目(cmake 和 qt)进行 google 测试,为此我需要测试两个图像的匹配。我有一个包含这些图像的文件夹(在项目目录之外)。我想访问这些图片,但不使用绝对路径。
像这样:
imread("home/../../test_images/img1.jpg")
但我想为图像文件夹设置一个通用路径,这样以后使用我的项目的任何人都只需要根据他们的机器设置他们的 test_image
文件夹路径,而不需要进行更改在代码中。
到目前为止我已经尝试了以下方法。
1。尝试添加 .qrc
资源文件并尝试访问图像。 (这不起作用,因为图像文件夹在项目目录之外。)
- 试图在 QT 构建环境设置中设置路径变量。
None 两种方法都有效。
我想要完成的事情:"To be able to avoid using an absolute path for the images I use and allow people trying to implement my code to only change the path at one place with their own test image locations."
编辑:
寻找一种设置变量 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 ,以便能够 use/access 变量 "IMAGES_PATH"在文件 sample1.cpp 和 sample2.cpp ?
有没有一种方法可以单独从 QT Creator 完成,而不是 运行 从终端完成?(通过修改 .sh 文件内容)?
或者可以在ExecutableScript.sh.in文件中手动设置路径吗?
如何从项目的其他 cpp 文件访问设置的这个变量?
在程序设置中定义图片路径。使用 QSettings class to store (persist) and retrieve your program settings when needed. You may want to provide your uses with a QDialog to edit your program settings. Here 是便携式应用程序的一个例子。
为了扩展我的建议,您可以使用 CMake 从用户配置和构建项目中获取初始默认路径。 CMake 可以像这样从命令行获取路径,然后使用 configure_file()
使用提供的路径填充可执行启动脚本。
运行 cmake
使用 -D
选项来填充名为 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;
}
...
}
生成可执行文件后,可以通过手动修改生成的启动脚本轻松更改图像的路径。最重要的是,此示例允许您在开始时设置一次默认位置,但您也不需要重新构建代码来更改图像文件路径。