小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
FASTDDS例程make出错
-
背景:
在动手学ROS2教学:使用DDS进行订阅发布这一章里,跑
hellofish例程在make时出错问题描述:
按照教学的顺序顺利跑到了下面这步,在最后一条指令make时出错:
cd dds_tutorial/examples/01-hellofishros
mkdir build && cd build
cmake ..
make报错信息:
/usr/bin/ld: warning: libfastcdr.so.1, needed by /opt/ros/foxy/lib/libfastrtps.so.2.1.4, may conflict with libfastcdr.so.2
/usr/bin/ld: CMakeFiles/DDSHelloFishRosPublisher.dir/src/idl_generate/HelloFishRos.cxx.o: undefined reference to symbol '_ZN8eprosima7fastcdr3Cdr10readStringERj'
/usr/bin/ld: /opt/ros/foxy/lib/libfastcdr.so.1: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/DDSHelloFishRosPublisher.dir/build.make:139:DDSHelloFishRosPublisher] 错误 1
make[1]: *** [CMakeFiles/Makefile2:90:CMakeFiles/DDSHelloFishRosPublisher.dir/all] 错误 2
make: *** [Makefile:91:all] 错误 2具体细节和上下文:
ros2用的是ubuntu20.0.4的foxy版本,shell用的是zsh,在前面各章执行命令时已经替换了ros2版本号和bashrc->zshrc,没有出过大问题,有小错误都顺利解决了,顺利安装了fastdds,到这一步出错无法解决
上一步给出的:
echo 'source xxx/fastdds_ws/install/setup.bash' >> ~/.bashrc
echo 'export PATH=$PATH:xxx/fastdds_ws/gradle-6.4/bin/' >> ~/.bashrc
echo 'export DDSGEN=xxx/fastdds_ws/src/fastddsgen/scripts' >> ~/.bashrc
已经改成了(xxx已替换为具体路径):
echo 'source xxx/fastdds_ws/install/setup.zsh' >> ~/.zshrc
echo 'export PATH=$PATH:xxx/fastdds_ws/gradle-6.4/bin/' >> ~/.zshrc
echo 'export DDSGEN=xxx/fastdds_ws/src/fastddsgen/scripts' >> ~/.zshrc尝试过的解决方法:
看出来是libfastcdr的版本冲突问题,但已经是github的最新版本2.0.0,找不到其他版本,不知道怎么解决
-
从你提供的错误信息来看,问题主要出在链接器(ld)在尝试链接你的DDS应用时,遇到了
libfastcdr
库的版本冲突。具体来说,ROS 2 Foxy 使用的libfastrtps
依赖于libfastcdr.so.1
,但你的系统中可能同时安装了libfastcdr.so.2
,这导致了版本冲突。这里有几个可能的解决方案:
1. 确保环境变量设置正确
首先,确保你的环境变量(如
LD_LIBRARY_PATH
)没有错误地包含指向libfastcdr.so.2
的路径。你可以通过打印LD_LIBRARY_PATH
来检查:echo $LD_LIBRARY_PATH
如果其中包含了指向
libfastcdr.so.2
的路径,你可能需要调整或清除这个环境变量。2. 使用ldconfig管理库文件
如果可能,使用
ldconfig
来管理你的库文件。这可以确保链接器在链接时找到正确的库版本。你可以通过编辑/etc/ld.so.conf
文件或/etc/ld.so.conf.d/
目录下的文件来添加库路径,然后运行sudo ldconfig
。3. 显式指定链接器选项
在 CMakeLists.txt 文件中,你可以显式地指定链接器应该使用哪个版本的
libfastcdr
。这可以通过设置target_link_libraries
时指定库的完整路径来实现。例如:target_link_libraries(your_target_name /path/to/libfastcdr.so.1)
但请注意,这通常不是推荐的做法,因为它会使你的项目依赖于特定的库文件路径。
4. 卸载或重新编译冲突的库
如果可能,尝试卸载
libfastcdr.so.2
或重新编译你的DDS库以使用与ROS 2兼容的版本。这可能需要你查看DDS库的文档或源代码,以了解如何指定编译时使用的库版本。5. 检查ROS 2和DDS的兼容性
确保你使用的DDS库与ROS 2 Foxy版本兼容。有时候,新版本的库可能不完全兼容旧版本的ROS 2。
6. 清理并重新构建
在尝试上述任何解决方案之前,最好先清理你的构建目录(删除
build
文件夹并重新创建它),然后再次运行cmake
和make
。7. 寻求社区帮助
如果上述方法都不能解决问题,你可以考虑在ROS 2或DDS的社区论坛、GitHub仓库或Stack Overflow等平台上寻求帮助。
希望这些建议能帮助你解决问题!
以上为生成回答,仅供参考~