2013-05-28 4 views
2

У меня есть копия OpenCV2.4.0 установлен в/USR/местные/БиблиотекаCMake линкер не может найти библиотеки OpenCV

Моя программа составлена ​​правильно, но когда линкер вызывается, он дал такие ошибки, как:

/home/zhouw/moos-ivp-zhouw/trunk/src/pATRTest/mst.cpp:661: undefined reference to 'cv::_OutputArray::_OutputArray(cv::Mat const&)' 
CMakeFiles/pATR.dir/mst.cpp.o:/home/zhouw/moos-ivp-zhouw/trunk/src/pATRTest/mst.cpp:675: more undefined references to `cv::_OutputArray::_OutputArray(cv::Mat const&)' 
collect2: ld returned 1 exit status 
make[2]: *** [../bin/pATR] Error 1 
make[1]: *** [src/pATRTest/CMakeFiles/pATR.dir/all] Error 2 
make: *** [all] Error 2 

Странно, что моя программа интенсивно использует opencv, если у CMake не получается найти библиотеки, он должен был жаловаться на гораздо более неопределенные ссылки, чем на некоторые из них.

Я попытался добавить LINK_DIRECTORIES ("/ usr/local/lib") в мой файл cmake, но это не помогло. В каталоге/usr/local/lib также установлена ​​другая библиотека под названием POCO. Моя программа также связывается с библиотеками POCO, но у CMake нет проблем с их поиском.

Если я вручную свяжусь с -L/usr/local/lib, он будет правильно связываться без ошибок.

CMakeLists.txt выглядит следующим образом

PROJECT(pATR) 

#what files are needed? 
SET(SRCS 
spline.hpp 
utils.hpp utils.cpp 
mst.hpp mst.cpp 
cluster.hpp cluster.cpp 
target.hpp target.cpp 
detector.hpp detector.cpp 
classifier.hpp classifier.cpp 
atr.hpp atr.cpp 
MOOSAtr.h MOOSAtr.cpp 
main.cpp 
) 

ADD_EXECUTABLE(pATR ${SRCS}) 

# indicate how to link 
#LINK_DIRECTORIES("/usr/local/lib") 
TARGET_LINK_LIBRARIES(pATR opencv_core opencv_highgui opencv_imgproc MOOS) 

INSTALL(TARGETS 
pATR 
RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin 
) 

Любая идея, что происходит? Большое спасибо!

ответ

3

Если у вас есть CMake 2.8, я рекомендую использовать find_package(OpenCV) для загрузки библиотек.

Существует пример в http://docs.opencv.org/doc/tutorials/introduction/linux_gcc_cmake/linux_gcc_cmake.html

CMake файла:

cmake_minimum_required(VERSION 2.8) 
project(DisplayImage) 
find_package(OpenCV REQUIRED) 
add_executable(DisplayImage DisplayImage.cpp) 
target_link_libraries(DisplayImage ${OpenCV_LIBS}) 
+0

Я попытался с find_package (OpenCV ТРЕБУЕТСЯ), прежде чем я отвечал на этот вопрос, я почему-то не связывают библиотеки как $ {OpenCV_LIBS}, но все же использовали их отдельные имена, т.е.е. opencv_core opencv_highgui opencv_imgproc. Спасибо, все работает сейчас! – Silmarilli

+1

Причудливая вещь произошла сегодня. Я скопировал все дерево каталогов моего программного обеспечения на другую Linux-машину с одинаковыми версиями всего и одной установки OpenCV. Ошибка связи! – Silmarilli

+0

Я добавил SET (OpenCV_LIBS opencv_core opencv_highgui opencv_imgproc), чтобы заставить его работать на этот раз. что это подразумевает? find_package не работает должным образом? – Silmarilli

1

Я не уверен, если это имеет смысл, что CMake не может найти связующие библиотеки. CMake находит ваши зависимости и генерирует Makefile, но он на самом деле не компилирует и не связывает вас.

Ваша ошибка не от CMake, не так ли? Они из марки.

Я всегда связать вручную с помощью этой

g++ -o myopencvapp `pkg-config --cflags --libs opencv` myopencvapp.cpp` 

при вызове г ++.

+0

Спасибо за ваш ответ! Да, ручные ссылки работают. Я просто подумал, что/usr/local/lib является каталогом по умолчанию для cmake для поиска библиотек – Silmarilli

1

Вы после того, как:

find_package(OPENCV COMPONENTS core imgproc highgui REQUIRED) 

Из документов:

Пакеты с компонентами

Некоторые библиотеки не являются монолитными, но приходят с одной или более зависимых библиотек или компонентов , Примечательным примером этого является Qt-библиотека, , которая поставляется (среди прочих) с компонентами QtOpenGL и QtXml. Чтобы использовать оба этих компонента, используйте следующую команду find_package :

find_package(Qt COMPONENTS QtOpenGL QtXml REQUIRED) 

https://cmake.org/Wiki/CMake:How_To_Find_Libraries

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