Как добавить папку изображений в проект CMake, чтобы использовать эти изображения в исполняемых файлах c ++? - PullRequest
0 голосов
/ 26 сентября 2019

Я совершенно новичок в Qt и CMake.Я выполняю тест Google на моем проекте (cmake и qt), для которого мне нужно проверить соответствие двух изображений.У меня есть папка (за пределами каталога проекта), которая содержит эти изображения.Я хочу получить доступ к этим изображениям, но не используя абсолютный путь.

Примерно так:

imread("home/../../test_images/img1.jpg")

Но я хочу установить общий путь к папке изображений, чтобы любой, кто использует мойПроекту позже нужно будет просто указать путь к папке test_image относительно своего компьютера, и не нужно вносить изменения в код.

До сих пор я пробовал следующее.

1,Попытался добавить файл ресурса .qrc и попытался получить доступ к изображениям.(Это не сработало, поскольку папка с изображениями находилась вне каталога проекта.)

Попытался установить переменную Path в настройках среды сборки QT.

Ни один из двух методов не сработал.

Чего я пытаюсь достичь: «Чтобы можно было избежать использования абсолютного пути для изображений, которые я использую, и позволить людям, пытающимся реализоватьмой код, чтобы изменить путь только в одном месте с их собственными местоположениями тестового изображения. "

Редактировать: Ищу способ установки переменной eg.IMG_PATH = "/path/to/image/files", которая может быть установлена ​​один раз, и только переменная используется повсеместноисполняемые файлы.Поэтому, когда кто-то клонирует мой проект, ему просто нужно обновить переменную IMG_PATH, указав путь к расположению своих файлов изображений.Так что теперь переменная IMG_PATH обновляется везде в остальных частях проекта.

Мой проект Структура:

  • -> CMakeList.txt -----> test -------> CMakeList.txt

--------> sample1.cpp

--------> sample2.cpp

--------> main.cpp

Образец 1,2 - это файлы c ++ с разными тестовыми сценариями.Main.cpp запускает все тесты.Как показано ниже:

#include "gtest/gtest.h" 

int main(int argc, char** argv)
 { 
       ::testing::InitGoogleTest(&argc, argv);

       return RUN_ALL_TESTS(); 
}

Согласно ответу @squareskittles, Как мне структурировать мой main.cpp, чтобы можно было использовать переменную IMAGES_PATH в файлах sample1.cpp и sample2.cpp.

А также при использовании этого метода мои тесты не могут быть вызваны.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Чтобы расширить мое предложение, вы можете использовать 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;
    }
    ...
}

После сборки исполняемого файла путь к изображениям можно легко изменить, изменив сгенерированный стартовый скрипт вручную.Самое главное, этот пример позволяет вам установить местоположение по умолчанию один раз в начале, но вам также не потребуется пересборка кода для изменения пути к файлу изображения.

0 голосов
/ 26 сентября 2019

Определите путь к изображениям в настройках вашей программы.Используйте класс QSettings для сохранения (сохранения) и извлечения настроек программы при необходимости.Возможно, вы захотите предоставить свое использование QDialog для редактирования настроек вашей программы. Здесь - это пример переносного приложения, которое делает это.

...