Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将图像文件夹添加到CMake项目中,以便在c++;可执行文件?_C++_Qt_Cmake_Googletest - Fatal编程技术网

C++ 如何将图像文件夹添加到CMake项目中,以便在c++;可执行文件?

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

我对Qt和CMake完全陌生。我一直在对我的项目(cmake和qt)进行谷歌测试,我需要测试两幅图像的匹配情况。我有一个文件夹(在项目目录之外)包含这些图像。我想访问这些图像,但不使用绝对路径

大概是这样的:

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文件夹位于项目目录之外,因此此操作不起作用。)

  • 试图在QT生成环境设置中设置路径变量 这两种方法都不起作用

    我试图做到的是:“能够避免对我使用的图像使用绝对路径,并允许尝试实现我的代码的人仅在一个地方使用他们自己的测试图像位置更改路径。”

    编辑: 正在寻找一种设置变量的方法
    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”

  • 除了从终端运行QT Creator之外,还有没有其他方法可以单独从QT Creator执行此操作?(通过修改.sh文件内容)

  • 或者可以在ExecutableScript.sh.in文件中手动设置路径

  • 如何从项目的其他cpp文件访问已设置的此变量


  • 在程序设置中定义图片路径。需要时,使用该类存储(持久化)和检索程序设置。您可能希望使用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_路径变量将在项目的其余部分的每个位置更新