catkin包库与openCV库的链接

问题描述 投票:0回答:1

我已经为这个问题迷茫了一段时间了。所以我需要在Ubuntu 18.04上由catkin构建的ros melodic包中使用opencv。我的想法是做一个实际上只是一个库的包,而这个库使用了所有常规的ros包(image_transport, cv_bridge, roscpp, rospy, std_msgs, genmsg, tf, actionlib_msgs, actionlib)。只是让你知道,我安装了2个opencv,openCV 3.2中的 usr/share 和openCV 4.3中的 usr/local/share这就是为什么我特别设置了openCV_DIR指向3.2版本。message 到CMakeList.txt中打印出opencv_version、opencv_include_dir和opencv_libs,版本是 3.2.0,include_dirs是 /usr/include;/usr/include/opencv 和自由派是 opencv_calib3d;opencv_core;opencv_features2d;opencv_flann;opencv_highgui;opencv_imgcodecs;opencv_imgproc;opencv_ml;opencv_objdetect;opencv_photo;opencv_shape;opencv_stitching;opencv_superres;opencv_video;opencv_videoio;opencv_videostab;opencv_viz;opencv_aruco;opencv_bgsegm;opencv_bioinspired;opencv_ccalib;opencv_datasets;opencv_dpm;opencv_face;opencv_freetype;opencv_fuzzy;opencv_hdf;opencv_line_descriptor;opencv_optflow;opencv_phase_unwrapping;opencv_plot;opencv_reg;opencv_rgbd;opencv_saliency;opencv_stereo;opencv_structured_light;opencv_surface_matching;opencv_text;opencv_ximgproc;opencv_xobjdetect;opencv_xphoto

在我 pkg_library CMakeList.txt 我有这。

cmake_minimum_required(VERSION 2.8.3)
project(pkg_libraries)

## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)

set( OpenCV_DIR "/usr/share/OpenCV/" )

## 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
          roscpp
          rospy
          std_msgs
          genmsg
          tf
          actionlib_msgs 
          actionlib

          sensor_msgs
          cv_bridge

          image_transport
          message_generation

)
find_package(
  OpenCV REQUIRED 
)

catkin_package(
  INCLUDE_DIRS include
  LIBRARIES pkg_libraries
  CATKIN_DEPENDS roscpp rospy std_msgs tf actionlib actionlib_msgs cv_bridge
)

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

add_library(${PROJECT_NAME}
            src/imageSaver.cpp 
)

target_link_libraries( ${PROJECT_NAME} ${catkin_LIBRARIES} ${OpenCV_LIBS} )

install(
  TARGETS ${PROJECT_NAME}
  ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
)
install(
  DIRECTORY include/${PROJECT_NAME}/
  DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
)

汇编 pkg_libraries 随着 catkin_build 看起来很好,但后来当我尝试做 catkin_build 的另一个包中,其中包括 pkg_libraries导致失败。

libpkg_libraries.so: undefined reference to `cv::imwrite(std::__cxx11::basic_string, std::allocator > const&, cv::_InputArray const& std:::vector > const&)'。

我认为这看起来像是链接器的错误,因为我已经使用了 cv::imwrite 只在 pkg_libraries......而报告错误的软件包只包括了 pkg_libraries. 所以... pkg_libraries 但明显没有链接好,但建好后却没有错误。

我在这里遗漏了什么?

谅谅

opencv cmake ros catkin
1个回答
0
投票

问题是由于 pkg_libraries 是像共享图书馆一样建立的,在这个图书馆里,我有另一个 .cpp.h 其中使用不同的 openCV 版本(默认为opencv 3.2),我认为问题的发生是因为加载了 libpkg_libraries.so 我已经在 openCV 版本。总之,现在我已经做了单独的库,它可以正常工作了。

谅谅

© www.soinside.com 2019 - 2024. All rights reserved.