Проблема с связью с OpenCV и CMake - PullRequest
       3

Проблема с связью с OpenCV и CMake

9 голосов
/ 14 сентября 2011

Я пишу программу, использующую OpenCV (установленную в локальном каталоге, поскольку у меня нет прав root на этом компьютере), и я написал соответствующий файл CMakeLists.txt. Моя проблема в том, что компиляция на этапе компоновки не удалась по-разному (я потратил три часа, пробуя все различные решения, предложенные в Интернете, поэтому я видел множество результатов). Вот вам конфигурации / результаты, которые имеют больше смысла для меня, даже если они приводят к ошибке: [в project_root / CMakeLists.txt]:

cmake_minimum_required(VERSION 2.8)
project(CUDA_learning)

set(OpenCV_INCLUDE_DIR "path/to/opencv_CUDA/include")
include_directories(${OpenCV_INCLUDE_DIR})
set(OpenCV_LIBS_DIR "path/to/opencv_CUDA/lib")
link_directories(${OpenCV_LIBS_DIR})
set(OpenCV_LIBS "opencv_core opencv_imgproc opencv_calib3d opencv_video opencv_features2d opencv_ml opencv_highgui opencv_objdetect opencv_contrib opencv_legacy opencv_gpu")

find_package(Boost COMPONENTS system filesystem program_options regex REQUIRED)
if(Boost_FOUND)
  include_directories(${Boost_INCLUDE_DIR})
else(Boost_FOUND)
  message(FATAL_ERROR "Cannot build application without Boost. Please set Boost_INCLUDE_DIR.")
endif(Boost_FOUND)

set(CMAKE_BUILD_TYPE debug)

add_definitions("-Wall")

set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/../bin)

subdirs (
  ../src
)

[в project_root / src / CMakeLists.txt]:

FILE(GLOB dir_source *.cc 2D/*.cc)
FILE(GLOB dir_header *.hh 2D/*.hh)

add_executable(${PROJECT_NAME} ${dir_source} ${dir_header})
target_link_libraries(${PROJECT_NAME} ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_FILESYSTEM_LIBRARY} ${Boost_SYSTEM_LIBRARY} ${OpenCV_LIBS})

Итог:

Linking CXX executable ../../bin/CUDA_learning
c++: opencv_imgproc: No such file or directory
c++: opencv_calib3d: No such file or directory
c++: opencv_video: No such file or directory
c++: opencv_features2d: No such file or directory
c++: opencv_ml: No such file or directory
c++: opencv_highgui: No such file or directory
c++: opencv_objdetect: No such file or directory
c++: opencv_contrib: No such file or directory
c++: opencv_legacy: No such file or directory
c++: opencv_gpu: No such file or directory

Если, вопреки рекомендациям, приведенным в сети, я ставлю «-l» перед именем библиотеки OpenCV, которое я получаю:

Linking CXX executable ../../bin/CUDA_learning
/usr/bin/ld: cannot find -lopencv_core
collect2: ld returned 1 exit status
make[2]: *** [../bin/CUDA_learning] Error 1
make[1]: *** [src/CMakeFiles/CUDA_learning.dir/all] Error 2
make: *** [all] Error 2

Кто-нибудь знает, как решить эту вещь? Я буквально схожу с ума от этого ... Заранее большое спасибо! Ура, Rob

Ответы [ 3 ]

5 голосов
/ 14 сентября 2011

Вот правильный способ включить OpenCV в ваш проект:

set(OpenCV_DIR "path/to/opencv_CUDA/share/OpenCV"
   CACHE PATH "The path where OpenCVConfig.cmake is placed")
find_package(OpenCV REQUIRED)

# and for each executable/library dependent on OpenCV
TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${OpenCV_LIBS} )
5 голосов
/ 14 сентября 2011

Эта строка:

set(OpenCV_LIBS "opencv_core opencv_imgproc opencv_calib3d opencv_video opencv_features2d opencv_ml opencv_highgui opencv_objdetect opencv_contrib opencv_legacy opencv_gpu")

... говорит, что у вас есть одна библиотека в переменной OpenCV_LIBS с гигантским именем с большим количеством пробелов. Если вы удалите двойные кавычки, как это:

set(OpenCV_LIBS opencv_core opencv_imgproc opencv_calib3d opencv_video opencv_features2d opencv_ml opencv_highgui opencv_objdetect opencv_contrib opencv_legacy opencv_gpu)

... тогда это будет список имен библиотек, и он должен работать просто отлично.

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

РЕДАКТИРОВАТЬ: (дополнительная информация на основе обсуждения в комментариях):

Если это по-прежнему не работает, дважды проверьте правильность используемых вами имен. С именами библиотек, которые вы здесь используете, должны быть файлы с именами libopencv_core.so, libopencv_imgproc.so и т. Д. В каталоге, названном переменной OpenCV_LIBS_DIR. Если эти точные имена библиотек не существуют в виде файлов, это объясняет ошибку компоновщика. (В этом случае, как обсуждалось в комментариях, фактические файлы были названы с номерами версий в именах файлов, и на них не было «не-версионных» символических ссылок, указывающих на них.)

0 голосов
/ 20 декабря 2012

проблема может заключаться в том, что компоновщик ищет файл с именем libopencv_core.so, но существует файл с аналогичным именем libopencv_core.so.1, в этом случае вам необходимо использовать символические ссылки. например сделать это ln -sf /opt/lib/libopencv_core.so.1 /opt/lib/libopencv_core.so

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...