Ошибка при загрузке события библиотеки после экспорта LD_LIBRARY_PATH - PullRequest
0 голосов
/ 28 октября 2019

Когда я выполняю один необходимый шаг в моем проекте:

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 Ответ

0 голосов
/ 07 ноября 2019

Ваша проблема не найдена в библиотеке. Дело в том, что в вашей библиотеке отсутствует символ, которого ожидали. Есть большая вероятность, что у вас просто установлена ​​неверная версия библиотеки. Что вы хотите сделать, это выполнить следующее:

# 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 для ros2. Это наводит меня на мысль, что библиотека преступников на самом деле 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

, но потому что вы пропустите этосимвол, вы не получите никаких результатов.

Таким образом, ваша проблема сводится к несовместимым библиотекам с 1 из 2 решений. Вы можете найти старый / новый источник для libfastrtps.so или более старый / новый источник для libsoss-dds.so. В идеале, если эти пакеты доступны через менеджер пакетов вашего дистрибутива, используйте его, чтобы сделать работу за вас.

...