OpenCV CMake неопределенная ссылка на функцию - PullRequest
1 голос
/ 15 марта 2020

У меня проблема с простой сборкой приложения OpenCV с CMake. Я потратил много часов, чтобы понять, в чем дело, но все же я понятия не имею ...

Я использую CLion в качестве IDE в Ubuntu 18.04

My CMakeList.txt

cmake_minimum_required(VERSION 3.15)
project(qt_segmentation)

set(CMAKE_CXX_STANDARD 11)

find_package( OpenCV REQUIRED )
add_executable(qt_segmentation main.cpp)

target_include_directories(qt_segmentation PUBLIC ${OpenCV_INCLUDE_DIRS})
target_link_libraries(qt_segmentation ${OPENCV_LIBS})

main. cpp

#include <iostream>
#include <opencv2/opencv.hpp>

int main()
{
    std::cout<<cv::getVersionRevision()<<std::endl;
    return 0;
}

Кажется, что сам компилятор работает правильно. Я могу скомпилировать свой файл с помощью следующей команды:

g++ -std=c++11 main.cpp `pkg-config --libs --cflags opencv` -o main

Ошибка:

====================[ Build | qt_segmentation | Debug ]=========================
/home/bienqq/clion-2019.3.4/bin/cmake/linux/bin/cmake --build /home/bienqq/CLionProjects/qt-segmentation/cmake-build-debug --target qt_segmentation -- -j 2
-- Configuring done
-- Generating done
-- Build files have been written to: /home/bienqq/CLionProjects/qt-segmentation/cmake-build-debug
[ 50%] Linking CXX executable qt_segmentation
CMakeFiles/qt_segmentation.dir/main.cpp.o: In function `main':
/home/bienqq/CLionProjects/qt-segmentation/main.cpp:6: undefined reference to `cv::getVersionRevision()'
CMakeFiles/qt_segmentation.dir/main.cpp.o: In function `cv::String::~String()':
/usr/local/include/opencv2/core/cvstd.hpp:648: undefined reference to `cv::String::deallocate()'
CMakeFiles/qt_segmentation.dir/main.cpp.o: In function `cv::String::operator=(cv::String const&)':
/usr/local/include/opencv2/core/cvstd.hpp:656: undefined reference to `cv::String::deallocate()'
collect2: error: ld returned 1 exit status
CMakeFiles/qt_segmentation.dir/build.make:83: recipe for target 'qt_segmentation' failed
make[3]: *** [qt_segmentation] Error 1
CMakeFiles/Makefile2:75: recipe for target 'CMakeFiles/qt_segmentation.dir/all' failed
make[2]: *** [CMakeFiles/qt_segmentation.dir/all] Error 2
CMakeFiles/Makefile2:82: recipe for target 'CMakeFiles/qt_segmentation.dir/rule' failed
make[1]: *** [CMakeFiles/qt_segmentation.dir/rule] Error 2
Makefile:118: recipe for target 'qt_segmentation' failed
make: *** [qt_segmentation] Error 2

Я также напечатал значения свойств CMake:

OpenCV_INCLUDE_DIRS=/usr/local/include;/usr/local/include/opencv

OpenCV_LIBS=opencv_calib3d;opencv_core;opencv_dnn;opencv_features2d;opencv_flann;opencv_highgui;opencv_imgcodecs;opencv_imgproc;opencv_ml;opencv_objdetect;opencv_photo;opencv_shape;opencv_stitching;opencv_superres;opencv_video;opencv_videoio;opencv_videostab

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

Не могли бы вы помочь? Спасибо :)

1 Ответ

0 голосов
/ 15 марта 2020

После многих часов исследования кажется, что CMake чувствителен к регистру : при изменении:

target_link_libraries(qt_segmentation ${OPENCV_LIBS})

на

target_link_libraries(qt_segmentation ${OpenCV_LIBS})

Поскольку свойство в CMake предполагает:

OpenCV_LIBS=opencv_calib3d;opencv_core;opencv_dnn;opencv_features2d;opencv_flann;opencv_highgui;opencv_imgcodecs;opencv_imgproc;opencv_ml;opencv_objdetect;opencv_photo;opencv_shape;opencv_stitching;opencv_superres;opencv_video;opencv_videoio;opencv_videostab

Все хорошо работает

...