Связывание с динамической библиотекой с зависимостями

Рассмотрим следующий сценарий:

  • Общая библиотека libA.so без зависимостей.
  • Совместно используемая библиотека libB.so, зависимая от libA.so.

Я хочу скомпилировать бинарный файл, связанный с libB. Должен ли я связать двоичный файл только с libB или с libA?

Есть ли способ связать только с прямыми зависимостями, разрешив разрешение неразрешенных символов из зависимостей во время выполнения?

Меня беспокоит тот факт, что реализация библиотеки libB может измениться в будущем, введя другие зависимости (например, libC, libD, libE). Будут ли у меня проблемы с этим?

Другими словами:

  • файлы libA: a.cpp ah
  • файлы libB: b.cpp bh
  • основные файлы программы: main.cpp

Конечно, b.cpp включает в себя ah и main .cpp включает bh

Команды компиляции:

g++ -fPIC a.cpp -c
g++ -shared -o libA.so a.o

g++ -fPIC b.cpp -c -I.
g++ -shared -o libB.so b.o -L. -lA

Какие из следующих опций следует использовать?

g++ main.cpp -o main -I. -L. -lB

или

g++ main.cpp -o main -I. -L. -lB -lA

Я не мог использовать первый вариант. Компоновщик жалуется на неразрешенные символы из библиотеки libA. Но для меня это звучит немного странно.

Большое спасибо.

-- Обновленные комментарии:

Когда я компоную бинарный файл, компоновщик попытается разрешить все символы из main и libB. Однако в libB есть неопределенные символы из библиотеки libA. Вот почему компоновщик жалуется на это.

Вот почему мне также нужно установить связь с libA.Однако я нашел способ игнорировать неразрешенные символы из общих библиотек. Похоже, для этого я должен использовать следующую командную строку:

g++ main.cpp -o main -I. -L. -lB -Wl,-unresolved-symbols=ignore-in-shared-libs

Похоже, что по-прежнему можно использовать параметр -rpath. Однако мне нужно понять это немного лучше.

Кто-нибудь знает возможные подводные камни при использовании опции -Wl,-unresolved-symbols=ignore-in-shared-libs?

-- Обновлен комментарий 2:

-rpathне следует использовать для этой цели. Полезно принудительно найти библиотеку в заданном каталоге. Подход -unresolved-symbolвыглядит намного лучше.

Еще раз спасибо.

68
задан David Berry 28 May 2014 в 15:47
поделиться