Почему при любом способе подключения 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 шт):
Оказалось, что библиотека, скомпилированная одним компилятором, не будет прочтена другим компилятором.
Данная версия OpenCV была скомпилирована компилятором Microsoft Visual C++ 2015 (файлы библиотеки находятся в папке vc15) и не могла быть прочитана моим MinGW. А когда я компилировал библиотеку собственноручно, то также совершал данную ошибку, генерируя проект для Visual Studio 2022.
Сборка OpenCV компилятором MinGW.
Чтобы скомпилировать исходный код для MinGW я выполнил такой порядок действий:
- Добавил путь к
MinGWв переменную средыPath, чтобы его мог использовать CMake и я из командной строки. - Скачал исходный код библиотеки. (Версия 4.5.5)
- Сконфигурировал и сгенерировал проект для компилятора из
MinGW
- Открыл командную строку в папке, куда
СMakeкладёт бинарники (Where to build the binares) и выполнил командуmingw32-make install, после чего пошёл достаточно долгий процесс компиляции библиотеки.
Далее, согласно инструкции из командной строки после завершения компиляции, я открыл
(папку с бинарниками из пункта 4)/install. Там находятся динамические и статические библиотеки (библиотеки импорта, как я понял) в соответствующих папках. Эти файлы переносим в проект. Файлы заголовков лежат в/install/include.После чего уже, соответственно, можно линковаться со всеми необходимыми вам статическими библиотеками, и, либо положить
.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.


