ROS、opencv3和CMake-无法删除库
ROS, opencv3 and CMake - unable to remove the library
工作环境:
- Kubuntu 14.04 LTS 64位
- ROS Indigo(最新的完整桌面安装(
- OpenCV 2.4.8
出于某种未知的原因,我决定安装ros-indigo-opencv3软件包,我几乎立即后悔了,因为我还有Ubuntu 14.04-OpenCV 2.4.8附带的默认版本。
起初,我注意到QtCreator警告我,当我只使用构建我的CMake项目时,2.4.8和3.0.0之间可能不兼容(你可以在本文末尾看到CMakeLists.txt(
find_package(OpenCV REQUIRED)
然后,围绕cv::stereoSGBM模块的一些缺失参考开始出现错误。名称空间或其他方面似乎有一些变化,我使用的库使用了OpenCV的2.x分支(发现这显然很难:D(,因此我告诉自己——我想我会删除上面提到的OpenCV 3.0.0的ROS包,并坚持2.4.8。
卸载那个软件包后,一切都变得一团糟。尽管在我的项目的CMakeLists.txt中,我明确指出了2.4.8版本。待使用
find_package(OpenCV 2.4.8 REQUIRED)
在用roslaunch启动我的节点时,立即死亡,并出现以下错误:
/pmd_nano_node:加载共享库时出错:libopencv_higgui.so.3.0:无法打开共享对象文件:没有这样的文件或目录
啊。。。可以我检查了我的系统上是否留下了什么东西(可能是坏软件包,无法安装,因此无法正确安装?(。让我惊讶的是,当我调用定位并用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/Indico/lib/时,发现没有一个文件与OpenCV远程相关,更不用说OpenCV 3.0.0了。
使用pkg配置至少会返回我所期望的:
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从未显示opencv2include文件夹(opencv2作为参数不被pkg配置识别(
进一步的调查使我重新运行我的项目的CMakeLists.txt,并按要求使用3.0版本,事实上,CMake现在抱怨只找到2.4.8。应用程序试图获得OpenCV共享库的3.0.0版本的原因还有待观察。
有什么建议或以前遇到过这种问题的人吗?
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至少解决了locate问题。运行时的错误仍然存在。
找到了解决方案。我的工作区似乎因为这个包的移除而一团糟。因此,在我删除devel和build,然后快速删除catkin_make之后,它现在运行良好。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- CMake 引用我在 ~/bin 中创建的随机 shell 脚本(即使我删除了它)?
- 如何一次删除"cmake -D"定义的所有变量?
- CMake 添加和删除宏定义以编译共享库/可执行文件
- 为什么CMake要从include_directories()调用中删除一些包含目录
- CMake 正在删除预处理器定义
- 带有AUTOMOC的CMake正在删除我的实现
- CMake 正在删除项目 c++
- 如何删除特定系统包括CMAKE中的目录
- PCL 和 CMake 的问题:链接时未定义统计异常值删除
- 在链接到使用 cmake 的 boost 库时删除 boost 依赖项
- CMake-删除单个翻译单元的编译标志
- 无法从使用 Cmake 创建的可执行文件中删除符号名称
- 在调用 cmake 之前删除构建文件夹中的所有内容是否合理
- CMake -从另一个CMake文件的GUI设置中删除一个选项
- 从CMake构建中删除libstdc++
- ROS、opencv3和CMake-无法删除库
- CMake/Ninja试图编译已删除的“.cpp”文件