2015-05-02 2 views
4

Аналогично этому question у меня проблемы с OpenCV и CMake на OS X 10.10.3.CMake не находит библиотеки OpenCV

После долгих хлопот мне наконец удалось создать бета-версию OpenCV 3.0 в моей системе; заголовки теперь находятся в /usr/local/include, а библиотеки - как и должны - находятся в /usr/local/lib. У меня есть небольшие программы, которые используют OpenCV, мой CMakeLists.txt выглядит следующим образом

set(CMAKE_CXX_FLAGS   "-O3 -w") 
find_package(OpenCV REQUIRED) 
if(OpenCV_FOUND) 
    message("Found OpenCV") 
    message("Includes: " ${OpenCV_INCLUDE_DIRS}) 
endif(OpenCV_FOUND) 

add_executable(cannyDetector canny/canny.cpp) 

target_link_libraries(cannyDetector ${OpenCV_LIBS}) 

я обычный

Undefined symbols for architecture x86_64: 
    "vtable for cv::_InputArray", referenced from: 
     _main in correctImage.o 
    NOTE: a missing vtable usually means the first non-inline virtual member function has no definition. 
    "vtable for cv::_OutputArray", referenced from: 
     _main in correctImage.o 
    NOTE: a missing vtable usually means the first non-inline virtual member function has no definition. 
ld: symbol(s) not found for architecture x86_64 
collect2: error: ld returned 1 exit status 
make[2]: *** [correctImage] Error 1 
make[1]: *** [CMakeFiles/correctImage.dir/all] Error 2 
make: *** [all] Error 2 

Переменная OpenCV_LIBS содержит

opencv_xphoto;opencv_xobjdetect;opencv_ximgproc;opencv_xfeatures2d;opencv_tracking;opencv_text;opencv_surface_matching;opencv_saliency;opencv_rgbd;opencv_reg;opencv_optflow;opencv_line_descriptor;opencv_latentsvm;opencv_ccalib;opencv_bioinspired;opencv_bgsegm;opencv_adas;opencv_videostab;opencv_videoio;opencv_video;opencv_ts;opencv_superres;opencv_stitching;opencv_shape;opencv_photo;opencv_objdetect;opencv_ml;opencv_imgproc;opencv_imgcodecs;opencv_highgui;opencv_hal;opencv_flann;opencv_features2d;opencv_core;opencv_calib3d 

Кроме того, ручной сборник работ:

gcc -o canny $(pkg-config --cflags opencv3) $(pkg-config --libs opencv3) -lstdc++ -w -O3 ../canny/canny.cpp 

(Я понятия не имею, почему я должен указывать -lstdc++, но без него ссылка не срабатывает по другой причине). При запуске make VERBOSE=1, следующая команда выполняется для исполняемого файла:

/opt/local/bin/g++ -O3 -w -lstdc++ -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/cannyDetector.dir/canny/canny.o -o cannyDetector /usr/local/lib/libopencv_xphoto.3.0.0.dylib /usr/local/lib/libopencv_ximgproc.3.0.0.dylib /usr/local/lib/libopencv_tracking.3.0.0.dylib /usr/local/lib/libopencv_text.3.0.0.dylib /usr/local/lib/libopencv_surface_matching.3.0.0.dylib /usr/local/lib/libopencv_saliency.3.0.0.dylib /usr/local/lib/libopencv_rgbd.3.0.0.dylib /usr/local/lib/libopencv_reg.3.0.0.dylib /usr/local/lib/libopencv_optflow.3.0.0.dylib /usr/local/lib/libopencv_line_descriptor.3.0.0.dylib /usr/local/lib/libopencv_latentsvm.3.0.0.dylib /usr/local/lib/libopencv_ccalib.3.0.0.dylib /usr/local/lib/libopencv_bioinspired.3.0.0.dylib /usr/local/lib/libopencv_bgsegm.3.0.0.dylib /usr/local/lib/libopencv_adas.3.0.0.dylib /usr/local/lib/libopencv_videostab.3.0.0.dylib /usr/local/lib/libopencv_ts.a /usr/local/lib/libopencv_superres.3.0.0.dylib /usr/local/lib/libopencv_stitching.3.0.0.dylib /usr/local/lib/libopencv_photo.3.0.0.dylib /usr/local/lib/libopencv_objdetect.3.0.0.dylib /usr/local/lib/libopencv_hal.a /usr/local/lib/libopencv_xobjdetect.3.0.0.dylib /usr/local/lib/libopencv_xfeatures2d.3.0.0.dylib /usr/local/lib/libopencv_shape.3.0.0.dylib /usr/local/lib/libopencv_video.3.0.0.dylib /usr/local/lib/libopencv_calib3d.3.0.0.dylib /usr/local/lib/libopencv_features2d.3.0.0.dylib /usr/local/lib/libopencv_ml.3.0.0.dylib /usr/local/lib/libopencv_highgui.3.0.0.dylib /usr/local/lib/libopencv_videoio.3.0.0.dylib /usr/local/lib/libopencv_imgcodecs.3.0.0.dylib /usr/local/lib/libopencv_imgproc.3.0.0.dylib /usr/local/lib/libopencv_flann.3.0.0.dylib /usr/local/lib/libopencv_core.3.0.0.dylib /usr/local/lib/libopencv_hal.a -framework AGL -framework OpenGL /usr/local/share/OpenCV/3rdparty/lib/libippicv.a 

Но, если я беру команду и заменить входной файл CMakeFiles/cannyDetector.dir/canny/canny.o от исходного входного файла ../canny/canny.cpp, это работает!

Итак, библиотеки все есть, но он все еще не компилируется, потому что компилятор не может связать объектный файл, но компиляция и привязка в один шаг работают.

Может ли кто-нибудь предложить, что здесь происходит?

+0

Используйте make VERBOSE = yes, чтобы получить подробный вывод о том, как cmake вызывает компилятор. – arved

+0

Вы * можете * создать библиотеки OpenCV с 'libstdC++', а CMake может пытаться использовать' libC++ '. Предложение: попробуйте добавить в файл CMake 'set (CMAKE_CXX_FLAGS) $ {CMAKE_CXX_FLAGS} -stdlib = libstdC++"). – Kiran

+0

@Kiran Вы правы, поскольку этот флаг определенно необходим, но его отсутствие не вызывает ошибки, но тот факт, что CMake отказывается найти библиотеки, которые находятся в 'usr/local/lib'. – oarfish

ответ

5

Исправление в моем случае состояло в том, чтобы указать CMake, где искать конфигурационный модуль OpenCV.

find_package(OpenCV REQUIRED PATHS /usr/local/share/OpenCV NO_DEFAULT_PATH) # manual specification of the OpenCVConfig.cmake path is necessary since otherwise, cmake assigns /opt/local a higher priority and ocv2.4 will be used 

По какой-то причине, /opt/local/share имели более высокий приоритет, чем /usr/local/share и, таким образом, только был найден конфигурационный файл для OpenCV 2.4, но я использовал 3.0. Я не совсем уверен, что вызывает ошибки связывания, но, возможно, какой-то код был перенесен из библиотек в заголовки в версии 3.0, которые нужно было скомпилировать рядом с кодом пользователя, но не потому, что CMake включал только заголовки версии 2.

Также

include_directories(${OpenCV_INCLUDE_DIRS}) 

отсутствовал.

+0

Спасибо. Это тоже помогло! – Grigory

Смежные вопросы