Ошибка загрузки библиотеки, но символ доступен из указанной библиотеки - PullRequest
0 голосов
/ 21 февраля 2011

Я пытаюсь написать привязку Python для библиотеки C ++ от поставщика, который у нас есть. Я иду вперед, но это довольно болезненно (отчасти потому, что у нас нет источника для библиотеки).

Сейчас gcc (4.4.4) жалуется на какой-то исключительный класс, который он не может найти:

Load library for "FOO_Sessions" failed, the system error message is "/home/djc/foo/lib/libFOO_Sessions.so: undefined symbol: _ZTIN3foo4some22SomeExceptionE"

Однако я обнаружил _ZTIN3foo4some22SomeExceptionE в libFOO_Elsewhere (используя objdump -x), который можно найти в том же / home / djc / foo / lib / dir, и на него уже ссылается ключ -l при вызове компилятора.

LD_DEBUG = все сообщает следующее (спасибо Эрику за предложение):

/home/djc/foo/lib/libFOO_Sessions.so: error: symbol lookup error: undefined symbol: _ZTIN3foo4some22SomeExceptionE (fatal)

Однако objdump -p сообщает об этом для libFOO_Sessions.so:

Dynamic Section:
  NEEDED               libFOO_Connections.so
  NEEDED               libFOO_Session_Base.so
  NEEDED               libstdc++.so.6
  NEEDED               libm.so.6
  NEEDED               libgcc_s.so.1
  NEEDED               libc.so.6
  SONAME               libFOO_Sessions.so

Разве libFOO_Elsewhere (который содержит _ZTIN3foo4some22SomeExceptionE) не должен быть в записи NEEDED и для libFOO_Sessions?

1 Ответ

1 голос
/ 21 февраля 2011

Установите LD_LIBRARY_PATH в / home / djc / foo / lib / перед запуском или явно загрузите зависимую библиотеку перед libFOO_Sessions.so. man ld-linux объясняет, как динамический компоновщик будет искать.

EDIT:

Кроме того, установите LD_DEBUG=all перед запуском, чтобы увидеть, как ищет динамический компоновщик.

...