ROS Kinetic下CMake手动链接libNewLib.so遇ld错误的配置咨询
解决ROS Kinetic中手动链接第三方库的ld报错问题
首先,你的配置思路没问题,但CMake的执行顺序和一些细节没处理对,才导致了/usr/bin/ld: cannot find -lNewLib的错误。我帮你拆解下问题和修正方案:
核心问题分析
- LINK_DIRECTORIES的位置错误:CMake是按顺序执行脚本的,你把
LINK_DIRECTORIES(${LIB_MANUALLY})放在了add_executable之后,这时候estimation这个目标已经被定义,后续的链接目录设置不会生效。 - 库链接写法的规范问题:直接写
libNewLib.so虽然能指定文件,但如果链接目录没生效,CMake还是会去系统默认路径查找,容易出现找不到库的情况。
修正后的CMakeLists.txt配置
我把关键修改点标注出来了,你可以参考这个版本:
cmake_minimum_required(VERSION 2.8.3) project(localization) add_compile_options(-std=c++11) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Ofast -march=native") set(LIB_MANUALLY "${CMAKE_CURRENT_SOURCE_DIR}/lib/") message(STATUS "LIB_MANUALLY : ${LIB_MANUALLY}") # 1. 提前设置链接目录,必须放在add_executable之前! LINK_DIRECTORIES(${LIB_MANUALLY}) find_package(catkin REQUIRED COMPONENTS cv_bridge image_transport roscpp rospy std_msgs ) find_package(OpenCV REQUIRED NO_MODULE PATHS /usr/local NO_DEFAULT_PATH) catkin_package( # INCLUDE_DIRS include # LIBRARIES localization CATKIN_DEPENDS cv_bridge image_transport roscpp rospy std_msgs # DEPENDS system_lib ) include_directories( include include/NewLib ${catkin_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS} ) add_executable(estimation src/pose_map_estimation.cpp src/pose_map_estimation_main.cpp ) # 2. 用-lNewLib的写法配合LINK_DIRECTORIES,更符合CMake规范 target_link_libraries(estimation ${catkin_LIBRARIES} ${OpenCV_LIBRARIES} -lNewLib)
额外检查项
- 确认
${CMAKE_CURRENT_SOURCE_DIR}/lib/目录下确实存在libNewLib.so,可以添加message(STATUS "Lib exists: " ${EXISTS ${LIB_MANUALLY}/libNewLib.so})来验证文件是否存在。 - 执行
catkin_make前,建议删除build和devel目录,清空缓存后重新编译,避免旧配置干扰。 - 检查库的架构是否匹配:如果你的
libNewLib.so是32位的,而ROS环境是64位,也会出现链接错误,可以用file libNewLib.so命令查看架构信息。
内容的提问来源于stack exchange,提问作者Ja_cpp
相关产品推荐
相关产品推荐

