Почему я получаю неопределенный символ при связывании разделяемой библиотеки, которая связывает статическую (gSoap) библиотеку? - PullRequest
0 голосов
/ 10 мая 2019

У меня есть динамическая библиотека, которая предоставляет сервисы onvif, связывая с libgsoapssl ++. Статическую библиотеку из gsoap, которую я перекомпилировал с -fPIC.

Затем я связываю эту динамическую библиотеку с исполняемым файлом, который использует ееСервисы.Когда я запускаю этот исполняемый файл, я получаю:

symbol lookup error: /usr/lib/libonvif.so: undefined symbol: soap_base64o

Кажется, что символ определен в динамической библиотеке, как показано в nm:

nm libonvif.so | grep soap_base64

00000000008cec40 T soap_base642s
0000000000914b60 R soap_base64i
0000000000914bc0 R soap_base64o

Исполняемый файл (onvifcl) выглядит правильнозависит от статической библиотеки (libonvif.so):

ldd onvifcl 

linux-vdso.so.1 (0x00007ffe623f6000)
libonvif.so => /usr/lib/libonvif.so (0x00007f4e09b86000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f4e097fd000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f4e095e5000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4e091f4000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f4e08e56000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4e0aa54000)

Я в недоумении, почему символ не определен.Кто-нибудь знает, что мне здесь не хватает?

Кстати, эта проблема возникла при разработке потенциального решения проблемы, которую я пытаюсь решить.Я пытаюсь использовать boost.python, чтобы обернуть классы динамической библиотеки, чтобы я мог получить к ней доступ из Python3.Это вызвало ошибки сегментации только при доступе к определенным структурам или методам gsoap, что привело меня к рассмотрению неразрешенных ссылок.Компиляция библиотеки gsoap в разделяемую библиотеку может решить эту проблему, но я не могу найти много, как это сделать.Если у кого-то есть идеи на этот счет или лучшая альтернатива boost.python, я был бы признателен за это.

1 Ответ

0 голосов
/ 13 мая 2019

Спасибо Майку Кингхану за указание на то, что я должен был увидеть.

Проблема здесь заключалась в старой версии общей библиотеки в / usr / lib, которая осталась после того, как я изменил LD_LIBRARY_PATH, чтобы он указывал на проект.конкретный каталог lib.Удаление библиотеки в / usr / lib решило непосредственную проблему и вызвало доступ к правильному экземпляру библиотеки.

...