symbol lookup error: ... undefined symbol: _ZN8eprosima7fastcdr3Cdr23allocate_xcdrv2_dheaderEv
问题
遇到 symbol lookup error: ... undefined symbol: _ZN8eprosima7fastcdr3Cdr23allocate_xcdrv2_dheaderEv
这样的错误通常是因为共享库中的符号解析失败,可能是库版本不匹配或动态链接问题。以下是一些解决步骤:
- 检查库版本
确保libfastdds.so.3.0
及其依赖项的版本与你的应用程序兼容。可以使用以下命令检查库的版本:
ldd ./devel/lib/motion_control/motion_ctrl
这将显示你的应用程序依赖的所有共享库和它们的路径。确保 libfastdds.so.3.0
的路径正确,并且库版本与其他相关库(如 fastcdr
)兼容。
- 检查环境变量
确认LD_LIBRARY_PATH
环境变量中包含了正确的库路径。如果有多个版本的Fast-DDS
安装,可能会导致库版本混淆。确保路径正确且优先级合适:
echo $LD_LIBRARY_PATH
确保路径指向正确的版本,比如 /home/leg_ctrl/Fast-DDS/install/fastdds/lib
。
- 检查编译和链接设置
确保你的项目在编译和链接时使用了正确的库版本。检查你的CMakeLists.txt
文件或其他构建配置文件,确认使用了正确的Fast-DDS
和Fast-CDR
库。 - 运行时检查
有时运行时库文件的冲突可能导致问题。尝试使用 ldd 命令来检查库文件是否被正确加载:
ldd ./devel/lib/motion_control/motion_ctrl
如果看到与 libfastdds 或其他相关库的路径不一致,可能需要调整 LD_LIBRARY_PATH 或重新安装库。
在这个问题上,就是在 ldd ./devel/lib/motion_control/motion_ctrl
之后,发现 fastcdr
的路径与 fastdds
的不一致,本来应该在 /home/leg_ctrl/Fast-DDS/install/fastcdr/lib
,却在 /opt/ros/noetic/lib
中,把意外存在于 /opt/ros/noetic/lib
中的部分删掉即可。