/usr/bin/ld: warning: libopencv_imgcodecs.so.3.2, needed by /usr/lib/x86_64-linux-gnu/libopencv_high

本文讲述了遇到的OpenCV库链接警告,并揭示了问题在于cmakeLists.txt中引用了错误的OpenCV版本。通过注释掉错误的路径设置,修复了cmake配置,确保了eco_tracker包的正确构建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

出现一个警告信息,暂时不管


/usr/bin/ld: warning: libopencv_imgcodecs.so.3.2, needed by /usr/lib/x86_64-linux-gnu/libopencv_highgui.so.3.2.0, may conflict with libopencv_imgcodecs.so.3.3
/usr/bin/ld: warning: libopencv_imgproc.so.3.2, needed by /usr/lib/x86_64-linux-gnu/libopencv_highgui.so.3.2.0, may conflict with libopencv_imgproc.so.3.3
/usr/bin/ld: warning: libopencv_core.so.3.2, needed by /usr/lib/x86_64-linux-gnu/libopencv_highgui.so.3.2.0, may conflict with libopencv_core.so.3.3
[100%] Built target eco_tracker

最后知道了原因,是因为cmakelists引用了错误的OpenCV版本,第十行代码set(OpenCV_DIR /usr/share/OpenCV)应该注释掉

#set(OpenCV_DIR /usr/share/OpenCV)

应该注释掉。下面是正确的cmakelist文件。注意,这是eco_tracker的package里面的cmakelists.txt

cmake_minimum_required(VERSION 3.0.2)
project(eco_tracker)

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

## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
#set(OpenCV_DIR /usr/share/OpenCV)

find_package(catkin REQUIRED COMPONENTS
  geometry_msgs
  roscpp
  rospy
  sensor_msgs
  std_msgs
  OpenCV
  cv_bridge
  image_transport
)

## System dependencies are found with CMake's conventions
# find_package(Boost REQUIRED COMPONENTS system)


## Uncomment this if the package has a setup.py. This macro ensures
## modules and global scripts declared therein get installed
## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html
# catkin_python_setup()

################################################
## Declare ROS messages, services and actions ##
################################################

## To declare and build messages, services or actions from within this
## package, follow these steps:
## * Let MSG_DEP_SET be the set of packages whose message types you use in
##   your messages/services/actions (e.g. std_msgs, a
Starting >>> calibration_manager --- stderr: calibration_manager CMake Deprecation Warning at CMakeLists.txt:11 (cmake_policy): The OLD behavior for policy CMP0072 will be removed from a future version of CMake. The cmake-policies(7) manual explains that the OLD behaviors of all policies are deprecated and that a policy should be set to OLD only under specific short-term circumstances. Projects should be ported to the NEW behavior and not rely on setting a policy to OLD. ** WARNING ** io features related to pcap will be disabled ** WARNING ** io features related to png will be disabled /usr/bin/ld: warning: libopencv_highgui.so.4.5d, needed by /home/lh/business_logic_modules/src/component_packages/calibration_manager/../../../mobile_robot_platform/ros2_ws/install/calibration_cameraimu/lib/calibration_cameraimu/libcalibration_cameraimu.so, may conflict with libopencv_highgui.so.3.4 /usr/bin/ld: warning: libopencv_video.so.4.5d, needed by /home/lh/business_logic_modules/src/component_packages/calibration_manager/../../../mobile_robot_platform/ros2_ws/install/calibration_cameraimu/lib/calibration_cameraimu/libcalibration_cameraimu.so, may conflict with libopencv_video.so.3.4 /usr/bin/ld: warning: libopencv_calib3d.so.4.5d, needed by /home/lh/business_logic_modules/src/component_packages/calibration_manager/../../../mobile_robot_platform/ros2_ws/install/calibration_cameraimu/lib/calibration_cameraimu/libcalibration_cameraimu.so, may conflict with libopencv_calib3d.so.3.4 /usr/bin/ld: /home/lh/business_logic_modules/src/component_packages/calibration_manager/../../../mobile_robot_platform/ros2_ws/install/calibration_cameraimu/lib/calibration_cameraimu/libcalibration_cameraimu.so: undefined reference to `KeyFrameDatabase::KeyFrameDatabase()' collect2: error: ld returned 1 exit status gmake[2]: *** [CMakeFiles/calibration_manager_node.dir/build.make:333:calibration_manager_node] 错误 1 gmake[1]: *** [CMakeFiles/Makefile2:137:CMakeFiles/calibration_manager_node.dir/all] 错误 2 gmake: *** [Makefile:146:all] 错误 2 ---
最新发布
07-04
<think>我们正在处理一个ROS2项目的编译问题,用户遇到了两个关键错误:1.undefined referenceto `KeyFrameDatabase`(这通常与ORB_SLAM2相关)2.OpenCV版本冲突(用户希望使用OpenCV3.4.15,但系统中有OpenCV4.5)根据用户提供的文件路径,系统中有OpenCV4.5的多个文件(如/usr/lib/x86_64-linux-gnu/libopencv_datasets.so.4.5d)。用户希望卸载OpenCV4.5或确保编译时只使用OpenCV3.4.15。解决方案:一、卸载OpenCV4.5(如果不需要多版本共存)二、在ROS2项目中强制使用OpenCV3.4.15(推荐,避免影响其他项目)由于卸载系统OpenCV可能影响其他软件,我们优先采用第二种方法:在ROS2项目中指定使用OpenCV3.4.15。步骤:1.确保已正确安装OpenCV3.4.15(参考之前的回答,安装到自定义路径如/opt/opencv-3.4.15)2.在ROS2项目的CMakeLists.txt中指定OpenCV路径3.解决KeyFrameDatabase未定义引用问题(这可能与链接库顺序有关)详细步骤:一、安装OpenCV3.4.15(如果尚未安装)参考之前的安装步骤,但这里建议安装到自定义路径(例如/opt/opencv-3.4.15)以避免系统路径冲突。二、在ROS2项目的CMakeLists.txt中指定OpenCV3.4.15在CMakeLists.txt中添加以下内容,确保找到的是OpenCV3.4.15:```cmake#设置OpenCV自定义安装路径set(OpenCV_DIR "/opt/opencv-3.4.15/share/OpenCV")#注意:这个路径下应有OpenCVConfig.cmake文件#查找OpenCVfind_package(OpenCV3.4.15 REQUIRED)#打印OpenCV版本以验证message(STATUS"FoundOpenCV: ${OpenCV_VERSION}") #包含头文件include_directories(${OpenCV_INCLUDE_DIRS})#在目标链接库时使用target_link_libraries(your_target ${OpenCV_LIBS})```三、解决undefinedreference to`KeyFrameDatabase`错误这个错误通常是由于链接库顺序不正确导致的。在CMake中,确保链接库的顺序遵循依赖关系(被依赖的库放在后面)。例如,如果`KeyFrameDatabase`在libORB_SLAM2.so中,而该库又依赖于OpenCV,那么链接顺序应为: ```cmaketarget_link_libraries(your_targetlibORB_SLAM2.so${OpenCV_LIBS}...) ```或者,如果ORB_SLAM2是一个静态库,则可能需要将OpenCV放在它之前(因为静态库链接时顺序很重要)。如果问题仍然存在,请检查:-是否正确安装了ORB_SLAM2?确保其头文件和库文件可用。-是否在CMakeLists.txt中链接了ORB_SLAM2库?四、如果必须卸载OpenCV4.5如果系统中安装的OpenCV4.5是通过apt安装的,可以尝试: ```bashsudo aptpurge libopencv*opencv*```但注意这可能会卸载依赖OpenCV的其他软件。如果OpenCV4.5是通过源码安装的,则需要进入其编译目录执行`sudomake uninstall`,如果已经删除了编译目录,则需要重新编译相同版本的OpenCV4.5然后卸载。五、环境变量设置(可选)在编译ROS2项目前,可以设置环境变量以确保找到正确的OpenCV版本: ```bashexport OpenCV_DIR=/opt/opencv-3.4.15/share/OpenCV```或者在CMake命令中指定:```bashcmake -DOpenCV_DIR=/opt/opencv-3.4.15/share/OpenCV.. ```六、验证在编译过程中,注意观察CMake的输出,确认找到的OpenCV版本为3.4.15。七、关于OpenCV卸载后文件残留用户提供的文件列表可能是通过apt安装的,因此可以使用`apt purge`卸载。但注意有些文件可能是其他opencv相关包的,例如:```bashsudo aptpurge python3-opencvlibopencv-devsudoapt autoremove```然后手动检查并删除残留文件(谨慎操作): ```bashsudo rm-rf/usr/include/opencv4/usr/share/opencv4/usr/lib/x86_64-linux-gnu/libopencv*```注意:删除前请备份重要数据。最后,由于用户问题中提到了`undefinedreference toKeyFrameDatabase`,这可能是ORB_SLAM2库的符号,因此请确保ORB_SLAM2已正确编译并链接了OpenCV3.4.15。如果以上步骤不能解决问题,请提供更多错误信息。相关问题:1.如何在ROS2项目中同时使用多个版本的OpenCV?2.如何正确编译ORB_SLAM2以与ROS2集成?3. CMake中如何调整链接库顺序来解决未定义引用问题?4.如何安全卸载通过不同方式安装的OpenCV版本?</think>### 解决 ROS2 编译错误:OpenCV 版本冲突与 KeyFrameDatabase 未定义引用 #### 问题分析 根据错误信息,存在两个核心问题: 1. **OpenCV 版本冲突**:系统同时存在 OpenCV 4.5 和 3.4.15,导致链接器使用了错误版本 2. **KeyFrameDatabase 未定义引用**:ORB_SLAM2 相关符号链接失败(通常由 OpenCV 版本不匹配或库链接顺序导致) --- ### 解决方案:强制使用 OpenCV 3.4.15 #### 第一步:验证 OpenCV 3.4.15 安装 ```bash # 检查 OpenCV 3.4.15 是否已正确安装 pkg-config --modversion opencv # 应输出: 3.4.15 # 检查库路径 pkg-config --libs opencv # 应包含类似: -L/usr/local/lib -lopencv_core -lopencv_highgui... ``` #### 第二步:在 ROS2 项目中指定 OpenCV 版本 在 `CMakeLists.txt` 中添加以下内容: ```cmake # 强制指定 OpenCV 3.4.15 路径 [^1][^2] set(OpenCV_DIR "/usr/local/share/OpenCV") # 替换为你的 OpenCV 3.4.15 路径 find_package(OpenCV 3.4.15 REQUIRED) # 显式包含头文件 include_directories(${OpenCV_INCLUDE_DIRS}) # 打印验证 message(STATUS "Using OpenCV version: ${OpenCV_VERSION}") message(STATUS "OpenCV libraries: ${OpenCV_LIBS}") # 链接时确保 OpenCV 在 ORB_SLAM2 之前 target_link_libraries(your_target ${OpenCV_LIBS} # 先链接 OpenCV ORB_SLAM2_LIB # 再链接 ORB_SLAM2 ) ``` #### 第三步:解决 KeyFrameDatabase 错误 ```cmake # 在 ORB_SLAM2 链接后添加系统库 target_link_libraries(your_target ORB_SLAM2_LIB # 补充必要的系统库 pthread dl GL glut GLEW ) ``` #### 第四步:编译时清除缓存 ```bash rm -rf build install log # 删除 ROS2 构建缓存 colcon build --cmake-args -DOpenCV_DIR=/usr/local/share/OpenCV ``` #### 第五步:环境变量覆盖(可选) ```bash # 临时覆盖链接库路径 export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH # 永久生效(添加到 ~/.bashrc) echo &#39;export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH&#39; >> ~/.bashrc ``` --- ### 备选方案:卸载 OpenCV 4.5 如果不需要多版本共存,可卸载 OpenCV 4.5: ```bash # 移除 apt 安装的 OpenCV sudo apt purge libopencv* python3-opencv # 删除残留文件 (谨慎操作!) sudo rm -rf \ /usr/include/opencv4 \ /usr/share/opencv4 \ /usr/lib/x86_64-linux-gnu/libopencv_* \ /usr/share/java/opencv* # 更新库缓存 sudo ldconfig ``` --- ### 验证成功 ```bash # 检查程序链接的 OpenCV 版本 ldd ./your_ros2_node | grep opencv # 在代码中验证 #include <opencv2/core/version.hpp> std::cout << "OpenCV version: " << CV_VERSION << std::endl; ``` > **关键点**: > 1. CMake 中链接顺序:OpenCV **必须** 在 ORB_SLAM2 之前链接 [^3] > 2. 使用 `pkg-config --modversion opencv` 确认默认版本 > 3. ORB_SLAM2 通常需要 OpenCV ≤3.4 版本兼容性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值