使用catkin_make构建ROS项目时无法找到libdofbot_kinemarics.so的问题
问题原因与解决方案
第一个错误:/usr/bin/ld: cannot find -ldofbot_kinemarics
核心原因
链接器找不到指定的共享库,主要有两个可能:
libdofbot_kinemarics.so不在链接器默认搜索路径(系统库路径、catkin工作空间的devel/lib目录)内,且CMake未正确指定库的搜索路径。- CMakeLists.txt的写法存在问题:直接写
libdofbot_kinemarics.so时,CMake会尝试在当前路径或默认路径查找文件,找不到就报错;若用-ldofbot_kinemarics的写法,链接器会自动补全lib前缀和.so后缀,但同样需要库在搜索路径内。
解决方法
- 先确认
libdofbot_kinemarics.so的实际存放位置,比如项目根目录下的libs文件夹。 - 在CMakeLists.txt中用
link_directories()指定库的搜索路径:link_directories(${PROJECT_SOURCE_DIR}/libs) - 然后在
target_link_libraries中使用去掉lib前缀和.so后缀的库名:
或者用target_link_libraries(dofbot_kinematics_fk ${catkin_LIBRARIES} dofbot_kinemarics)find_library做更规范的路径指定:find_library(DOFBOT_KIN_LIB dofbot_kinemarics PATHS ${PROJECT_SOURCE_DIR}/libs NO_DEFAULT_PATH) target_link_libraries(dofbot_kinematics_fk ${catkin_LIBRARIES} ${DOFBOT_KIN_LIB})
第二个错误:/usr/bin/ld:libdofbot_kinemarics.so: error adding symbols: file in wrong format
核心原因
这个错误表明共享库的格式与当前编译环境不兼容,常见情况包括:
- 架构不匹配:比如系统是x86_64(64位),但
libdofbot_kinemarics.so是32位(i386/i686)编译产物;或者反过来。可以用以下命令验证:# 查看库的架构信息 file libdofbot_kinemarics.so # 查看当前系统架构 uname -m - 库文件损坏或类型错误:该文件不是合法的ELF共享库,比如是静态库(.a文件改了后缀)、未编译完成的目标文件(.o),或是在下载/拷贝过程中损坏。
- ABI不兼容:库是用不同版本的编译器、ROS版本或系统库编译的,导致链接时符号无法匹配。
解决方法
- 验证库的架构与系统是否一致,不一致则需要重新编译对应架构的共享库。
- 用
readelf -h libdofbot_kinemarics.so检查是否为合法的ELF共享库,若输出异常说明文件损坏,需重新获取或编译。 - 确保库的编译环境与当前ROS项目环境一致:使用相同的Ubuntu版本、ROS版本、编译器版本重新编译
libdofbot_kinemarics.so。
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

