Избегайте связывания OpenCV2.4 и OpenCV3.0 с cmake

У меня есть 2 установки opencv (в отдельном месте). Один устанавливается с помощью apt-get (версия 2.4). В то время как другая версия 3.0 устанавливается из исходного кода.

Я заметил, что мой catkin_make (cmake) связывает как opencv2.4, так и opencv3.0

[ri-desktop2 robotic_vision]$ ldd devel/lib/visensor_dgem/dgem 
    linux-vdso.so.1 =>  (0x00007ffd30f5e000)
    libcv_bridge.so => /opt/ros/jade/lib/libcv_bridge.so (0x00007f7eb7fa8000)
    libopencv_highgui.so.2.4 => /usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4 (0x00007f7eb7d5d000)
    libopencv_core.so.2.4 => /usr/lib/x86_64-linux-gnu/libopencv_core.so.2.4 (0x00007f7eb7926000)
    libroscpp.so => /opt/ros/jade/lib/libroscpp.so (0x00007f7eb75d3000)
    libroscpp_serialization.so => /opt/ros/jade/lib/libroscpp_serialization.so (0x00007f7eb73d0000)
    librosconsole.so => /opt/ros/jade/lib/librosconsole.so (0x00007f7eb71a7000)
    librostime.so => /opt/ros/jade/lib/librostime.so (0x00007f7eb6f7d000)
    libboost_system.so.1.54.0 => /usr/lib/x86_64-linux-gnu/libboost_system.so.1.54.0 (0x00007f7eb6d79000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7eb6b5b000)
    libopencv_core.so.3.0 => /usr/local/lib/libopencv_core.so.3.0 (0x00007f7eb5b1b000)
    libopencv_highgui.so.3.0 => /usr/local/lib/libopencv_highgui.so.3.0 (0x00007f7eb58dd000)
    libopencv_imgproc.so.3.0 => /usr/local/lib/libopencv_imgproc.so.3.0 (0x00007f7eb4941000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f7eb463d000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f7eb4427000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7eb4062000)
    libopencv_imgproc.so.2.4 => /usr/lib/x86_64-linux-gnu/libopencv_imgproc.so.2.4 (0x00007f7eb3bd2000)
    libGL.so.1 => /usr/lib/nvidia-352/libGL.so.1 (0x00007f7eb38a2000)
    libjpeg.so.8 => /usr/lib/x86_64-linux-gnu/libjpeg.so.8 (0x00007f7eb364d000)
    libpng12.so.0 => /lib/x86_64-linux-gnu/libpng12.so.0 (0x00007f7eb3427000)
    libtiff.so.5 => /usr/lib/x86_64-linux-gnu/libtiff.so.5 (0x00007f7eb31b5000)
    libjasper.so.1 => /usr/lib/x86_64-linux-gnu/libjasper.so.1 (0x00007f7eb2f5e000)
    libIlmImf.so.6 => /usr/lib/x86_64-linux-gnu/libIlmImf.so.6 (0x00007f7eb2caf000)
    libHalf.so.6 => /usr/lib/x86_64-linux-gnu/libHalf.so.6 (0x00007f7eb2a6c000)
    libgtk-x11-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0 (0x00007f7eb242f000)
    libgdk-x11-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgdk-x11-2.0.so.0 (0x00007f7eb217c000)
    libgobject-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 (0x00007f7eb1f2b000)
    libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f7eb1c23000)
    libgtkglext-x11-1.0.so.0 => /usr/lib/libgtkglext-x11-1.0.so.0 (0x00007f7eb1a1f000)
    libgdkglext-x11-1.0.so.0 => /usr/lib/libgdkglext-x11-1.0.so.0 (0x00007f7eb17bb000)
    libdc1394.so.22 => /usr/lib/x86_64-linux-gnu/libdc1394.so.22 (0x00007f7eb1547000)
    libv4l1.so.0 => /usr/lib/x86_64-linux-gnu/libv4l1.so.0 (0x00007f7eb1341000)
    libavcodec.so.54 => /usr/lib/x86_64-linux-gnu/libavcodec.so.54 (0x00007f7eb05ed000)
    libavformat.so.54 => /usr/lib/x86_64-linux-gnu/libavformat.so.54 (0x00007f7eb02cb000)
    libavutil.so.52 => /usr/lib/x86_64-linux-gnu/libavutil.so.52 (0x00007f7eb00a6000)
    libswscale.so.2 => /usr/lib/x86_64-linux-gnu/libswscale.so.2 (0x00007f7eafe5f000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f7eafb59000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f7eaf940000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f7eaf738000)
    libtbb.so.2 => /usr/lib/libtbb.so.2 (0x00007f7eaf504000)
    libxmlrpcpp.so => /opt/ros/jade/lib/libxmlrpcpp.so (0x00007f7eaf2e6000)
    libcpp_common.so => /opt/ros/jade/lib/libcpp_common.so (0x00007f7eaf0de000)
    libboost_thread.so.1.54.0 => /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.54.0 (0x00007f7eaeec8000)
    libboost_filesystem.so.1.54.0 => /usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.54.0 (0x00007f7eaecb2000)
    librosconsole_log4cxx.so => /opt/ros/jade/lib/librosconsole_log4cxx.so (0x00007f7eaea9e000)
    librosconsole_backend_interface.so => /opt/ros/jade/lib/librosconsole_backend_interface.so (0x00007f7eae89c000)

Мой CMakeLists.txt

cmake_minimum_required(VERSION 2.8.3)
project(visensor_node)

find_package(catkin REQUIRED COMPONENTS
  roscpp 
  message_generation
  geometry_msgs
  sensor_msgs 
  cv_bridge 
  std_msgs 
  image_transport 
  camera_info_manager 
  dynamic_reconfigure
  cmake_modules
)

# check libvisensor version, flags not used later
find_package(libvisensor 1.1.0 REQUIRED)

add_message_files(
  DIRECTORY msg
  FILES visensor_imu.msg 
  visensor_time_host.msg
  visensor_calibration.msg
)

add_service_files(
    FILES
    visensor_calibration_service.srv
)

generate_messages(DEPENDENCIES geometry_msgs)

include_directories(include ${catkin_INCLUDE_DIRS} ${libvisensor_INCLUDE_DIRS})

find_package(Eigen3 REQUIRED)
include_directories(${EIGEN_INCLUDE_DIR})
add_definitions(${EIGEN_DEFINITIONS})

find_package(OpenCV 3.0 REQUIRED COMPONENTS core highgui imgproc)

generate_dynamic_reconfigure_options(cfg/visensor_node.cfg)

if(NOT DEFINED CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release)
endif(NOT DEFINED CMAKE_BUILD_TYPE)

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native -Wall -std=c++0x -D__STRICT_ANSI__")

catkin_package(
  INCLUDE_DIRS include ${catkin_INCLUDE_DIRS}
  CATKIN_DEPENDS
  roscpp 
  sensor_msgs 
  cv_bridge 
  std_msgs 
  image_transport 
  camera_info_manager 
)

#build and add libvisensor system library dependency
add_executable(visensor_node src/visensor_node.cpp src/visensor.cpp )
add_executable(custom_node src/custom_node.cpp include/custom_node.h)

add_dependencies(visensor_node ${${PROJECT_NAME}_EXPORTED_TARGETS}})
add_dependencies(custom_node ${${PROJECT_NAME}_EXPORTED_TARGETS}})

target_link_libraries(visensor_node ${libvisensor_LIBRARIES} ${catkin_LIBRARIES} ${OpenCV_LIBRARIES})
target_link_libraries(custom_node ${libvisensor_LIBRARIES} ${catkin_LIBRARIES} ${OpenCV_LIBRARIES})

Что может пойти не так.?


person mkuse    schedule 28.10.2015    source источник
comment
Я не уверен, может ли это быть проблемой, но, возможно, одна из зависимостей вашего пакета использует OpenCV 2.4? Вы должны быть в состоянии проверить это, напечатав ${catkin_LIBRARIES} и посмотреть, указан ли там OpenCV 2.4.   -  person luator    schedule 28.10.2015
comment
Выглядит хорошо. Вы вызываете find_package (сначала OpenCV, поэтому все вызовы find_package не будут выполняться, поскольку используются кэшированные значения. Или есть еще одна часть ссылки OpenCV, помимо основного highgui imgproc?   -  person usr1234567    schedule 28.10.2015
comment
Я понимаю это. На самом деле мой ros зависел от opencv2.4, как и сережка. который, в свою очередь, имел cv_bridge. В качестве решения я установил ros из исходников. Это исправило это.   -  person mkuse    schedule 29.10.2015
comment
Возможный дубликат Как изменить каталог библиотеки в пакете в ros ubuntu   -  person Paul Roub    schedule 08.01.2016


Ответы (1)


Недавно я опубликовал это как ответ здесь

Библиотеки могут быть включены и связаны с include_directories() и link_directories() следующим образом:

cmake_minimum_required(VERSION 2.4.6)
include($ENV{ROS_ROOT}/core/rosbuild/rosbuild.cmake)
...
include_directories(${PROJECT_SOURCE_DIR})

include_directories(/path/to/opencv/OpenCV-2.4.1/include)
link_directories(/path/to/opencv/OpenCV-2.4.1/lib)
...

# Set the build type.  Options are:
#  Coverage       : w/ debug symbols, w/o op ...

и удалить стд. ссылка на ваши текущие библиотеки OpenCV.

person SolvedForHome    schedule 08.01.2016
comment
Пожалуйста, не публикуйте только ссылки на ответы на другие вопросы о переполнении стека. Вместо этого проголосуйте/отметьте, чтобы закрыть как дубликат, или, если вопрос не является дубликатом, адаптируйте ответ к этому конкретному вопросу. - person Tim; 08.01.2016