Почему при любом способе подключения OpenCV выдается ошибка `undefined reference to ...`?

Операционная система - Windows 10

Я пробовал собирать OpenCV самостоятельно, но при любом использовании API OpenCV, даже при простом объявлении cv::Mat mat; код не компилируется. Такая же ошибка возникает и при использовании уже собранной версии OpenCV.

Проект компилируется при помощи MinGW, собирается при помощи CMake.

Конфиг CMake:

cmake_minimum_required(VERSION 3.0)
project(ImagePixelizer VERSION 0.1)

set(CMAKE_CXX_STANDARD 20)

add_subdirectory(lib/tinyfd)

add_executable(ImagePixelizer src/main.cpp src/SelectFileDialog/FileDialog.cpp)

target_include_directories(ImagePixelizer PRIVATE
        lib/SFML/include/
        lib/OpenCV/include
        lib/tinyfd/include)

target_link_libraries(
        ImagePixelizer
        ${PROJECT_SOURCE_DIR}/lib/SFML/lib/libsfml-graphics.a
        ${PROJECT_SOURCE_DIR}/lib/SFML/lib/libsfml-window.a
        ${PROJECT_SOURCE_DIR}/lib/SFML/lib/libsfml-system.a
        ${PROJECT_SOURCE_DIR}/lib/OpenCV/lib/opencv_world455.lib
        TinyFileDialogs)

Файлы библиотеки:

Структура файлов подключённой библиотеки

Папку include показывать не стал, так как там всё как надо.

Также добавил в переменную среды Path путь к .dll библиотеки.


Ответы (1 шт):

Автор решения: Dmitriy Grape

Оказалось, что библиотека, скомпилированная одним компилятором, не будет прочтена другим компилятором.

Данная версия OpenCV была скомпилирована компилятором Microsoft Visual C++ 2015 (файлы библиотеки находятся в папке vc15) и не могла быть прочитана моим MinGW. А когда я компилировал библиотеку собственноручно, то также совершал данную ошибку, генерируя проект для Visual Studio 2022.

Сборка OpenCV компилятором MinGW.

Чтобы скомпилировать исходный код для MinGW я выполнил такой порядок действий:

  1. Добавил путь к MinGW в переменную среды Path, чтобы его мог использовать CMake и я из командной строки.
  2. Скачал исходный код библиотеки. (Версия 4.5.5)
  3. Сконфигурировал и сгенерировал проект для компилятора из MinGW

введите сюда описание изображения

  1. Открыл командную строку в папке, куда СMake кладёт бинарники (Where to build the binares) и выполнил команду mingw32-make install, после чего пошёл достаточно долгий процесс компиляции библиотеки.

введите сюда описание изображения

  1. Далее, согласно инструкции из командной строки после завершения компиляции, я открыл (папку с бинарниками из пункта 4)/install. Там находятся динамические и статические библиотеки (библиотеки импорта, как я понял) в соответствующих папках. Эти файлы переносим в проект. Файлы заголовков лежат в /install/include.

  2. После чего уже, соответственно, можно линковаться со всеми необходимыми вам статическими библиотеками, и, либо положить .dll-ки в папку с исполняемым файлом, либо добавить в Path.

target_link_libraries(
        Target
        ${PROJECT_SOURCE_DIR}/lib/OpenCV/lib/libopencv_imgcodecs455.dll.a
        ${PROJECT_SOURCE_DIR}/lib/OpenCV/lib/libopencv_imgproc455.dll.a
        ${PROJECT_SOURCE_DIR}/lib/OpenCV/lib/libopencv_core455.dll.a
        ${PROJECT_SOURCE_DIR}/lib/OpenCV/lib/libopencv_highgui455.dll.a
        ${PROJECT_SOURCE_DIR}/lib/OpenCV/lib/libopencv_gapi455.dll.a
        ${PROJECT_SOURCE_DIR}/lib/OpenCV/lib/libopencv_video455.dll.a
        ${PROJECT_SOURCE_DIR}/lib/OpenCV/lib/libopencv_videoio455.dll.a
        ${PROJECT_SOURCE_DIR}/lib/OpenCV/lib/libopencv_photo455.dll.a)

После проделанных махинаций проект успешно запускается без каких-либо ошибок.

За подсказку спасибо @user7860670.

→ Ссылка