На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела *nix / gcc / Eclipse / Qt / wxWidgets / GTK+
  • При создании темы ОБЯЗАТЕЛЬНО указывайте версию тулкита / библиотеки / компилятора.
  • Перед тем как задать вопрос, сформулируйте его правильно, чтобы вас могли понять.
  • Нарушение Правил может повлечь наказание со стороны модераторов.


Полезные ссылки:
user posted image Boost по-русски
user posted image Qt по-русски
Модераторы: archimed7592
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> QTCreator и OpenCV
    Windows 10 64 bit, Qt Creator 9.0.0, кит Desktop Qt6.4.1 shared MinGW-w64 MINGW64 (MSYS2). В простой программе:
    ExpandedWrap disabled
      #include <iostream>
      #include <string>
      #include <opencv2/highgui.hpp>
      #include <opencv2/imgcodecs.hpp>
      #include <opencv2/imgproc.hpp>
       
      int DisplayMessage(std::string sMes)
      {
        std::cout << sMes << std::endl;
        system("pause");
        exit(EXIT_SUCCESS);
      }
       
      int main()
      {
        cv::Mat img = cv::imread("Access.jpg", cv::IMREAD_UNCHANGED);
        if(img.empty())
          DisplayMessage("Image missing!");
        cv::imwrite("result.jpg", img);
        DisplayMessage("");
      }
    Получаю следующие ошибки:
    :-1: ошибка: debug/main.o: in function `main':
    D:\MyProgramming\qtTestCons\main.cpp:16: ошибка: undefined reference to `cv::imread(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)'
    :-1: ошибка: D:\MyProgramming\build-qtTestCons-Desktop_Qt_6_4_1_shared_MinGW_w64_MINGW64_MSYS2-Debug/../qtTestCons/main.cpp:17: undefined reference to `cv::Mat::empty() const'
    :-1: ошибка: D:\MyProgramming\build-qtTestCons-Desktop_Qt_6_4_1_shared_MinGW_w64_MINGW64_MSYS2-Debug/../qtTestCons/main.cpp:19: undefined reference to `cv::imwrite(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, cv::_InputArray const&, std::vector<int, std::allocator<int> > const&)'
    :-1: ошибка: D:\MyProgramming\build-qtTestCons-Desktop_Qt_6_4_1_shared_MinGW_w64_MINGW64_MSYS2-Debug/../qtTestCons/main.cpp:21: undefined reference to `cv::Mat::~Mat()'
    :-1: ошибка: D:\MyProgramming\build-qtTestCons-Desktop_Qt_6_4_1_shared_MinGW_w64_MINGW64_MSYS2-Debug/../qtTestCons/main.cpp:21: undefined reference to `cv::Mat::~Mat()'
    :-1: ошибка: collect2.exe: error: ld returned 1 exit status
    Файл pro:
    ExpandedWrap disabled
      QT -= gui
       
      CONFIG += c++17 console
      CONFIG -= app_bundle
       
      SOURCES += \
              main.cpp
       
      INCLUDEPATH   += D:/opencv/build/include
      INCLUDEPATH   += D:/opencv/build/x64/vc16/lib
      CONFIG(debug, debug|release): {
      LIBS += -LD:/opencv/build/x64/vc16/lib -lopencv_world470d
      } else:CONFIG(release, debug|release): {
      LIBS += -LD:/opencv/build/x64/vc16/lib -lopencv_world470
      }
    Подскажите, пожалуйста, как исправить программу.
      Цитата tumanovalex @
      ошибка: undefined reference to

      Говорит об одном - какой-то либы в линковке нет. Попробуй варианты и отпишись (это добавить в файл проекта .pro):

      1)
      ExpandedWrap disabled
        CONFIG += opencv

      2)
      ExpandedWrap disabled
        CONFIG += link_pkgconfig
        PKGCONFIG += opencv

      Начинай со второго варианта - он предпочтительней. В нем pkg-config еще и нужные флаги должен сам подтягивать.
        Спасибо за ответ. Я понял, что не найдены библиотеки, но знаю, как это исправить.
        ExpandedWrap disabled
          CONFIG += opencv
        те же ошибки
        ExpandedWrap disabled
          CONFIG += link_pkgconfig
          PKGCONFIG += opencv
        :-1: ошибка: Project ERROR: opencv development package not found
        Для установки OpenCV использовал opencv-4.7.0-windows.zip, скаченный с сайта OpenCV. В Path ничего не включал.
          Цитата tumanovalex @
          -1: ошибка: Project ERROR: opencv development package not found
          Для установки OpenCV использовал opencv-4.7.0-windows.zip, скаченный с сайта OpenCV. В Path ничего не включал.

          Ну так не нужно - у тебя же есть MSYS2! Сноси ту либу, что скачал, и загрузи уже настроенный пакет из терминала MSYS2:

          Смотрим какие пакеты есть:
          ExpandedWrap disabled
            pacman -sS opencv

          Инсталлируем нужный пакет (например, mingw64/mingw-w64-x86_64-opencv):
          ExpandedWrap disabled
            pacman -S mingw64/mingw-w64-x86_64-opencv

          Ну а потом попробуй вариант с pkg-config. Правда, если ты в MSYS2 и pkg-config не ставил - поставь его по примеру выше для opencv.
            На всякий случай - я тут когда-то в FAQ по С/С++ статейку про MSYS2 написал, ознакомься, обновись.
              Статью прочитал, спасибо. Как-то я забыл, что можно использовать Msys2. Сообщения pacman
              ExpandedWrap disabled
                mingw64/mingw-w64-x86_64-opencv 4.7.0-1 [installed]
                    Open Source Computer Vision Library (mingw-w64)
                mingw64/mingw-w64-x86_64-pkgconf 1~1.8.0-2 (mingw-w64-x86_64-toolchain) [installed]
                    pkg-config compatible utility which does not depend on glib
              изменил файл проекта
              ExpandedWrap disabled
                QT -= gui
                 
                CONFIG += c++17 console
                CONFIG -= app_bundle
                 
                SOURCES += \
                        main.cpp
                 
                INCLUDEPATH   += D:/msys64/mingw64/include
                INCLUDEPATH   += D:/msys64/mingw64/include/opencv4
                INCLUDEPATH   += D:/msys64/mingw64/lib
                 
                LIBS += -LD:/msys64/mingw64/lib
                 
                CONFIG += link_pkgconfig
                PKGCONFIG += opencv
              Получаю "Project ERROR: opencv development package not found". Что-то у меня ничего не получается.
                Попробуй вот тaк:

                ExpandedWrap disabled
                  #include <iostream>
                  #include <string>
                  #include "opencv2/imgcodecs.hpp"
                   
                  int DisplayMessage(std::string sMes)
                  {
                    std::cout << sMes << std::endl;
                    system("pause");
                    exit(EXIT_SUCCESS);
                  }
                   
                  int main()
                  {
                    cv::Mat img = cv::imread("Access.jpg", cv::IMREAD_UNCHANGED);
                    if(img.empty())
                      DisplayMessage("Image missing!");
                    cv::imwrite("result.jpg", img);
                    DisplayMessage("");
                  }


                ExpandedWrap disabled
                  TEMPLATE = app
                  CONFIG += console c++17
                  CONFIG -= app_bundle
                  CONFIG -= qt
                   
                  CONFIG += link_pkgconfig
                  PKGCONFIG += opencv4
                   
                  SOURCES += \
                          main.cpp

                Обрати внимание: opencv4
                  Так получилось. Но будет ли возможность в программе на QT работать с OpenCV при параметре CONFIG -= qt?
                    Цитата tumanovalex @
                    Но будет ли возможность в программе на QT работать с OpenCV при параметре CONFIG -= qt?

                    Не не не, если Qt нужно в работе - эту настройку нужно удалить. Я просто не заметил у тебя в коде использование Qt, ну и по привычке его отключил.
                      Правильно ли я понимаю следующее:
                      1. CONFIG += link_pkgconfig - настраивает pkgconfig на поиск библиотек
                      2. Если прописать:
                      ExpandedWrap disabled
                        PKGCONFIG += gtk4
                        PKGCONFIG += boost
                      то тогда в программе можно использовать QT, GTK4, OpenCV и boost? Т.е. можно создать проект, в котором можно использовать все самые мощные библиотеки C++?
                        Да, все верно.

                        Добавлено
                        Цитата tumanovalex @
                        CONFIG += link_pkgconfig - настраивает pkgconfig на поиск библиотек

                        Если быть точнее - подключает использование pkgconfig.
                          Цитата tumanovalex @
                          Т.е. можно создать проект, в котором можно использовать все самые мощные библиотеки C++?

                          В этом и есть самая главная фишечка MSYS2 - этот проект предоставляет уже собранные и протестированные библиотеки, готовые к использованию, с условием использования там же предоставляемых тулчейнов. Ну а pkg-config - это некое подобие пакетного менеджера для C/C++. Не совсем полноценный, но все же хелпер. Желательно прочитать про него.

                          Что касается Qt - то проекты в QtCreator'е вполне могут работать и без pkg-config, такова специфика QtCreator (по сути он для Qt и заточен). А вот для всего остального лучше использовать pkg-config. Еще раз см. его описание.
                            Попытался совместить OpenCV и boost. Файл pro:
                            ExpandedWrap disabled
                              TEMPLATE = app
                               
                              TARGET = qtTestCons
                              CONFIG += console c++17
                              CONFIG -= app_bundle
                              #CONFIG -= qt
                               
                              INCLUDEPATH   += D:/msys64/mingw64/include
                              INCLUDEPATH   += D:/msys64/mingw64/include/boost
                               
                              CONFIG += link_pkgconfig
                              PKGCONFIG += opencv4
                              PKGCONFIG += boost
                               
                              SOURCES += \
                                      main.cpp
                            Файл cpp:
                            ExpandedWrap disabled
                              #include <iostream>
                              #include <string>
                              #include <boost/filesystem/operations.hpp>
                              #include <opencv2/imgcodecs.hpp>
                               
                              int DisplayMessage(std::string sMes)
                              {
                                std::cout << sMes << std::endl;
                                system("pause");
                                exit(EXIT_SUCCESS);
                              }
                               
                              void TestBoost()
                              {
                                boost::filesystem::directory_iterator begin("./");
                                boost::filesystem::directory_iterator end;
                                for (; begin != end; ++ begin)
                                {
                                  boost::filesystem::file_status fs = boost::filesystem::status(*begin);
                                  {
                                  switch (fs.type())
                                  {
                                    case boost::filesystem::regular_file:
                                      std::cout << "FILE ";
                                      break;
                                    case boost::filesystem::symlink_file:
                                      std::cout << "SYMLINK ";
                                      break;
                                    case boost::filesystem::directory_file:
                                      std::cout << "DIRECTORY ";
                                      break;
                                    default:
                                        std::cout << "OTHER ";
                                        break;
                                  }
                                  if (fs.permissions() & boost::filesystem::owner_write)
                                  {
                                      std::cout << "W ";
                                  }
                                  else
                                  {
                                      std::cout << " ";
                                  }
                                  std::cout << *begin << '\n';
                                  }
                                }
                              }
                               
                              void TestQT()
                              {
                               cv::Mat img = cv::imread("Access.jpg", cv::IMREAD_UNCHANGED);
                                if(img.empty())
                                  DisplayMessage("Image missing!");
                                cv::imwrite("result.jpg", img);
                              }
                               
                               
                              int main()
                              {
                                TestQT();
                                TestBoost();
                                DisplayMessage("");
                              }
                            Получаю ошибку "Project ERROR: boost development package not found". Как эту ошибку исправить? Boost установлен:
                            ExpandedWrap disabled
                              mingw64/mingw-w64-x86_64-boost 1.81.0-4 [installed]
                                  Free peer-reviewed portable C++ source libraries (mingw-w64)


                            Добавлено
                            Я включил в файл проекта INCLUDEPATH, тогда заголовочные файлы можно указывать в <...>. OpenCV при этом работает. Как лучше делать - в ковычках или так?
                              Проект прикрепил.
                              Прикреплённый файлПрикреплённый файлqtTestCons.zip (16,2 Кбайт, скачиваний: 39)
                                Цитата tumanovalex @
                                Получаю ошибку "Project ERROR: boost development package not found". Как эту ошибку исправить? Boost установлен

                                Ок, давай по порядку ...

                                1. В проекте MSYS2 не все библиотеки поддерживают сборку через pkg-config, вот boost - одна из таких
                                2. Список библиотек, которые поддерживаются pkg-config'om, можно посмотреть тут lib/pkgconfig/*.pc (где каждый такой файл описывает отдельную либу, которую можно подключить через pkg-config)
                                3. Пути к инклудам и либам тулчейна в проекте прописывать не нужно, они уже прописаны в комплекте для используемого тулчейна, если нужно - так это нестандартные дополнительные
                                4. Какие обрамляющие символы использовать в директиве #include лучше почитать тут. Если коротко - угловые для стандартных заголовков STL и установленных либ, а кавычки - для заголовков разрабатываемого проекта. Обычно так.
                                5. Осталось просто подключить boost руками. Но, посмотрев /lib можно заметить, что эта библиотека разнесена на множество библиотечных файлов ...

                                По итогу меняем файл проекта вот на такое содержимое:

                                ExpandedWrap disabled
                                  TEMPLATE = app
                                  CONFIG += console c++17
                                  CONFIG -= app_bundle
                                   
                                  LIBS += "-llibboost_filesystem-mt"
                                   
                                  CONFIG += link_pkgconfig
                                  PKGCONFIG += opencv4
                                   
                                  SOURCES += \
                                          main.cpp


                                После этого проект должен собраться. Кстати, в MSYS2 используется GCC v.12.2.0 - а он полностью поддерживает С++20 (модули частично), и в нем уже давно есть в STL std::filesystem, начиная с С++17 ... буст не нужен ;)
                                2 пользователей читают эту тему (2 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0477 ]   [ 17 queries used ]   [ Generated: 21.05.24, 14:06 GMT ]