ROS, opencv3 и CMake - невозможно удалить библиотеку

Рабочая среда:

  • Kubuntu 14.04 LTS, 64-разрядная версия
  • ROS Indigo (последняя версия, полная установка на рабочий стол)
  • OpenCV 2.4.8

По какой-то неизвестной причине я решил установить пакет ros-indigo-opencv3, о чем почти сразу пожалел из-за того, что у меня также есть версия по умолчанию, которая поставляется с Ubuntu 14.04 - OpenCV 2.4.8.

Сначала я заметил, что QtCreator предупреждал меня о возможной несовместимости между 2.4.8 и 3.0.0, когда я создавал свой проект CMake (вы можете увидеть CMakeLists.txt в конце этого сообщения), используя только

find_package(OpenCV REQUIRED)

Затем начали возникать ошибки из-за какой-то недостающей ссылки в модуле cv :: stereoSGBM. Кажется, есть некоторые изменения в пространствах имен или что-то еще, и библиотека, которую я использую, использует ветвь 2.x OpenCV (очевидно, что трудный путь: D), поэтому я сказал себе - я думаю, я удалю вышеупомянутый пакет ROS для OpenCV 3.0.0 и придерживайтесь версии 2.4.8.

После удаления этого пакета все пошло наперекосяк. Хотя в CMakeLists.txt моего проекта я явно указал версию 2.4.8. быть использованным

find_package(OpenCV 2.4.8 REQUIRED)

при запуске мой узел с roslaunch сразу умер со следующей ошибкой:

... / pmd_nano_node: ошибка при загрузке общих библиотек: libopencv_highgui.so.3.0: невозможно открыть файл общих объектов: нет такого файла или каталога

Ха ... Хорошо ... Я проверил, осталось ли что-нибудь в моей системе (возможно, плохой пакет, который не удалось установить и, соответственно, правильно установить?). К моему удивлению после вызова locate и передачи результата с помощью grep

user:~$ locate libopencv | grep 3.0

я получил

/opt/ros/indigo/lib/libopencv_calib3d.so.3.0
/opt/ros/indigo/lib/libopencv_calib3d.so.3.0.0
/opt/ros/indigo/lib/libopencv_core.so.3.0
/opt/ros/indigo/lib/libopencv_core.so.3.0.0
...

(basically all opencv libs)

Так что там все-таки что-то осталось (я кое-что про все: D). Однако представьте мое удивление, когда я cd -ed к / opt / ros / indigo / lib / и обнаружил НЕ ОДИН файл, даже отдаленно связанный с OpenCV, не говоря уже об OpenCV 3.0. 0.

Использование pkg-config возвращает то, что я ожидал, по крайней мере:

user:~$ pkg-config --cflags opencv
-I/usr/include/opencv
user:~$ pkg-config --libs opencv
/usr/lib/x86_64-linux-gnu/libopencv_calib3d.so ...
-lopencv_calib3d ...

Примечание. Я до сих пор не знаю, почему --cflags никогда не показывает папку include opencv2 (аргумент opencv2 не распознается pkg-config)

Дальнейшее расследование заставило меня повторно запустить файл CMakeLists.txt для моего проекта с версией 3.0.0 в качестве требования, и действительно, теперь CMake жалуется, что обнаружен только 2.4.8. По какой причине приложение пытается получить версию 3.0.0 общих библиотек OpenCV, еще предстоит выяснить.

Любой совет или кто-то, кто сталкивался с такой проблемой раньше?

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.3)
project(pmd_nano)

SET(CMAKE_CXX_FLAGS "-std=c++0x -fpermissive -Wno-deprecated -Wno-sign-compare")
SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g -Wall")
SET(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
SET(CMAKE_CXX_LINK_FLAGS_DEBUG "-pg")

## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
  cv_bridge
  image_transport
  pcl_conversions
  pcl_msgs
  pcl_ros
  roscpp
  sensor_msgs
  std_msgs
)

## System dependencies are found with CMake's conventions
find_package(Boost REQUIRED COMPONENTS system)
find_package(PCL REQUIRED)
find_package(OpenCV 2.4.8 REQUIRED COMPONENTS highgui imgproc)
# Do NOT use OpenCV 3.0.0 or all hell will break loose. Package incompatilibity will be a fascinating thing to deal with...

###################################
## catkin specific configuration ##
###################################
## The catkin_package macro generates cmake config files for your package
## Declare things to be passed to dependent projects
## INCLUDE_DIRS: uncomment this if you package contains header files
## LIBRARIES: libraries you create in this project that dependent projects also need
## CATKIN_DEPENDS: catkin_packages dependent projects also need
## DEPENDS: system dependencies of this project that dependent projects also need
catkin_package(
 INCLUDE_DIRS include
#  LIBRARIES pmd_nano
 CATKIN_DEPENDS cv_bridge image_transport pcl_conversions pcl_msgs pcl_ros roscpp sensor_msgs std_msgs uvc_camera
 DEPENDS
   system_lib # Boost PCL OpenCV
   boost_system
   PCL
   opencv_highgui opencv_imgproc
)

###########
## Build ##
###########

## Specify additional locations of header files
## Your package locations should be listed before other locations
# include_directories(include)
include_directories(
  ${catkin_INCLUDE_DIRS}
  ${Boost_INCLUDE_DIRS}
  ${PCL_INCLUDE_DIRS}
  ${OpenCV_INCLUDE_DIRS}
)

## Declare a cpp library
# add_library(pmd_nano
#   src/${PROJECT_NAME}/pmd_nano_node.cpp
# )

## Declare a cpp executable
add_executable(pmd_nano_node
    src/pmd_nano_node.cpp
    src/ColorCamera.cpp
    src/DepthCamera.cpp
    src/PMDNano.cpp
)

## Add cmake target dependencies of the executable/library
## as an example, message headers may need to be generated before nodes
# add_dependencies(pmd_nano_node pmd_nano_generate_messages_cpp)

## Specify libraries to link a library or executable target against
target_link_libraries(${PROJECT_NAME}_node ${catkin_LIBRARIES})
#link_directories(${PROJECT_NAME}_node ${Boost_LIBRARY_DIRS})
target_link_libraries(${PROJECT_NAME}_node boost_system)
link_directories(${PROJECT_NAME}_node ${PCL_LIBRARY_DIRS})
target_link_libraries(${PROJECT_NAME}_node opencv_highgui opencv_imgproc)
target_link_libraries(${PROJECT_NAME}_node pthread)

target_link_libraries(pmd_nano_node ${PROJECT_SOURCE_DIR}/lib/libpmdaccess2.so)


#############
## Testing ##
#############

## Add gtest based cpp test target and link libraries
# catkin_add_gtest(${PROJECT_NAME}-test test/test_pmd_nano.cpp)
# if(TARGET ${PROJECT_NAME}-test)
#   target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME})
# endif()

## Add folders to be run by python nosetests
# catkin_add_nosetests(test)

РЕДАКТИРОВАТЬ:

Запуск sudo updatedb по крайней мере решил проблему найти. Однако ошибка во время выполнения все еще присутствует.


person rbaleksandar    schedule 01.08.2015    source источник


Ответы (1)


Нашел решение. Казалось, что на моем рабочем месте был беспорядок из-за удаления пакета. Итак, после того, как я удалил devel и build, а затем быстро catkin_make, он теперь работает нормально.

person rbaleksandar    schedule 01.08.2015
comment
Это всегда первое, что я делаю, если в сережке есть что-то странное (на самом деле, мне приходится делать это довольно часто ...). Я не уверен, что это проблема cmake или что-то особенное в catkin, но кажется, что есть некоторые автоматически сгенерированные файлы, которые не обновляются автоматически при изменении среды. - person luator; 02.08.2015
comment
В последнее время я так часто убираю чертово рабочее пространство, что мне казалось, что я это сделал. XD Что касается проблемы с сережкой или cmake - я думаю, что это первая проблема, поскольку сам CMake сразу обнаружил, что 3.0.0 больше не доступен. Хотя catkin использует CMake, в нем также есть много дополнительных вещей. Было бы неплохо, если бы они изменили это поведение, если честно. Не в первый раз я потратил так много времени на решение проблемы, которой вообще не должно было быть. - person rbaleksandar; 02.08.2015