当我在项目中执行一个必要步骤时:
ubuntu@cscsh:~$ soss dds_to_ros2.yaml
\Error while loading the library ["/home/dbt/rosis_workspace/soss/install/soss-dds/lib/soss/dds/../../libsoss-dds.so"]: /home/dbt/rosis_workspace/soss/install/soss-dds/lib/soss/dds/../../libsoss-dds.so: undefined symbol: _ZTVN8eprosima8fastrtps28DisablePositiveACKsQosPolicyE
Could not find system handle for middleware of type [dds]
Failed to load middlewares!
所以我这样做:
ubuntu@cscsh:~/rosis_workspace/soss/install/soss-dds/lib$ ldd libsoss-dds.so
linux-vdso.so.1 (0x00007fff5ef61000)
libfastrtps.so.1 => /home/dbt/ros2_ws/src/eProsima/install/fastrtps/lib/libfastrtps.so.1 (0x00007f8ae4179000)
libsoss-core.so => /home/dbt/rosis_workspace/soss/install/soss-core/lib/libsoss-core.so (0x00007f8ae3de1000)
libyaml-cpp.so.0.5 => /usr/lib/x86_64-linux-gnu/libyaml-cpp.so.0.5 (0x00007f8ae3b67000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f8ae3948000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f8ae35bf000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f8ae33a7000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8ae2fb6000)
libfastcdr.so.1 => /home/dbt/ros2_ws/src/eProsima/install/fastcdr/lib/libfastcdr.so.1 (0x00007f8ae2da3000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8ae2b9f000)
libtinyxml2.so.6 => /usr/lib/x86_64-linux-gnu/libtinyxml2.so.6 (0x00007f8ae298b000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8ae4aae000)
libboost_program_options.so.1.65.1 => /usr/lib/x86_64-linux-gnu/libboost_program_options.so.1.65.1 (0x00007f8ae270a000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f8ae236c000)
然后执行命令
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/dbt/ros2_ws/src/eProsima/install/fastrtps/lib
ubuntu@cscsh:~/ros2_ws/src/eProsima$ echo $LD_LIBRARY_PATH
/home/dbt/rosis_workspace/soss/install/soss-ros2-test/lib:/home/dbt/rosis_workspace/soss/install/soss-ros2/lib:/home/dbt/rosis_workspace/soss/install/soss-mock/lib:/home/dbt/rosis_workspace/soss/install/soss-json/lib:/home/dbt/rosis_workspace/soss/install/soss-dds/lib:/home/dbt/rosis_workspace/soss/install/soss-core/lib:/home/dbt/ros2_ws/src/eProsima/install/fastcdr/lib:/home/dbt/ros2_ws/src/eProsima/install/fastrtps/lib
但是当我执行:soss dds_to_ros2.yaml 时。 同样的错误消息仍然存在。 有谁知道这有什么问题吗?
您的问题是找不到图书馆。 这是因为您的库缺少预期的符号。 您很可能只是安装了错误版本的库。您要做的就是运行以下命令:
# You will need the full path if you are not in that directory...
objdump -Tt /home/dbt/rosis_workspace/soss/install/soss-dds/lib/libsoss-dds.so | \
grep -w _ZTVN8eprosima8fastrtps28DisablePositiveACKsQosPolicyE
您可能会看到类似的内容:
0000000000000000 DF *UND* 0000000000000000 _ZTVN8eprosima8fastrtps28DisablePositiveACKsQosPolicyE
这是正确的,但这意味着该符号未在此库中定义,但它希望在
ldd
为您列出的库之一中找到它。 我的第一个猜测是libsoss-core.so
,但我们正在寻找不兼容的版本,并且这个库似乎与libsoss-dds.so
具有相同的根目录,因此这些版本绝对应该兼容。 如果您想查看库是否包含特定符号,只需按照我上面的方式运行 objdump
即可。 在互联网上快速搜索该库符号后,我被带到了 ros2
的 github 问题页面。 这让我相信罪魁祸首库实际上是
libfastrtps.so.1
。 如果您运行以下命令:
objdump -Tt /home/dbt/ros2_ws/src/eProsima/install/fastrtps/lib/libfastrtps.so.1 | \
grep -w _ZTVN8eprosima8fastrtps28DisablePositiveACKsQosPolicyE
并且库包含
libsoss-dds.so
正在寻找的符号,这将是您的结果:
0000000000002cc0 g DF .text 0000000000000011 Base _ZTVN8eprosima8fastrtps28DisablePositiveACKsQosPolicyE
但是因为您缺少此符号,您将不会收到任何结果。
所以你的问题归结为与 2 个解决方案之一不兼容的库。 您可以找到
libfastrtps.so
的旧/新源或 libsoss-dds.so
的旧/新源。 理想情况下,如果这些包可以通过您的发行版的包管理器获得,请使用它来为您完成工作。