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-идох /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 никога не показва включената папка 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 Що се отнася до това дали проблемът е catkin или cmake - мисля, че е първият, откакто самият CMake веднага откри, че 3.0.0 вече не е наличен. Въпреки че catkin използва CMake, има и много допълнителни неща. Би било хубаво, ако сменят това поведение, за да бъда честен. Не за първи път прекарвам толкова много време, занимавайки се с проблем, който не трябваше да е там на първо място. - person rbaleksandar; 02.08.2015