导出 LD_LIBRARY_PATH 后加载库事件时出错

Posted

技术标签:

【中文标题】导出 LD_LIBRARY_PATH 后加载库事件时出错【英文标题】:Error while loading the library event after export LD_LIBRARY_PATH 【发布时间】:2019-10-28 03:04:52 【问题描述】:

当我在我的项目中执行一个必要的步骤时:

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。 仍然存在相同的错误消息。 有谁知道这是怎么回事?

【问题讨论】:

【参考方案1】:

您的问题是找不到库。这是您的图书馆缺少预期的符号。您很有可能只是安装了错误版本的库。您要做的是运行以下命令:

# 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。在网上快速搜索了那个图书馆符号后,我被带到了github issue pageros2。这让我相信罪魁祸首库实际上是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 个解决方案中的 1 个不兼容的库。您可以找到libfastrtps.so 的旧/新源或libsoss-dds.so 的旧/新源。理想情况下,如果这些包可通过您的发行版的包管理器获得,请使用它为您完成工作。

【讨论】:

以上是关于导出 LD_LIBRARY_PATH 后加载库事件时出错的主要内容,如果未能解决你的问题,请参考以下文章

导出后加载 TensorFlow 对象检测模型

如何在cppyy中加载库?

在 Code::Blocks 中加载库时出错

无法在 play-games-plugin-for-unity 中加载库 libgpg.so

在salesforce闪存中加载库mapsjs-core和mapsjs-service时出错

MpMoviePlayer 在停止事件后加载音频