Динамическое связывание и встреча dyld: ленивая привязка символа не удалась: символ не найден:

Я нахожусь в autotool среда.

Я занимаюсь разработкой библиотеки A который использует библиотеку B а также C как зависимости.

  • я строю B с libtool поэтому вывод libB.la
  • я строю C с простым Makefile и вывод libC.a
  • я строю A с libtool, а вывод libA.la

Затем я создаю тестовую программу, которая связывает эти библиотеки вместе.

Makefile.am ниже.

check_PROGRAMS = acc_test

AM_CPPFLAGS = -I$(top_srcdir)/include \
-I$(top_srcdir)/deps/C/include \
-I$(top_srcdir)/deps/B/includeLDADD = $(top_builddir)/src/libA.la \
$(top_builddir)/deps/B/src/libB.la \
$(top_builddir)/deps/C/libC.a

acc_test_SOURCES = test.cpp

Когда я бегу acc_testЯ встречаю

dyld: сбой привязки ленивых символов: символ не найден: __ZN7leveldb7OptionsC1Ev
Ссылка на: /Users/somepath/build/src/.libs/libA.0.dylib
Ожидается в: плоское пространство имен

dyld: символ не найден: __ZN7leveldb7OptionsC1Ev
Ссылка на: /Users/somepath/cw/build/src/.libs/libA.0.dylib
Ожидается в: плоское пространство имен

Это моя главная проблема.

После того, как я попробовал много вещей, я нашел это.

  • Сбой при вызове некоторых функций C библиотека внутри A, Если я прокомментирую их из A код, это не сбой.
  • Случай 1: если я пишу код, используя C явно в test.cppне падает.
  • Случай 2: если я добавлю AM_LDFLAGS = -staticне падает.
  • Случай 3: я пытался смоделировать ту же ситуацию с Bне падает.

Мои вопросы ниже

  1. Почему он падает в первую очередь? Я предполагаю, что речь идет о динамической загрузке, но я не понимаю это полностью.
  2. В случае 1, почему он не падает?
  3. В случае 2, почему он не падает?
  4. Есть ли другие способы решить эту проблему без -static? Я думаю, что это странно, если пользователю нужно статически связать эти библиотеки, когда они хотят использовать мою библиотеку A
  5. В случае 3, почему он не падает? Я заметил, что многие реализации lib B в заголовках. Это связано?

Спасибо

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]