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

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

Shared Library libA.so ,with no dependencies. Shared Library libB.so, with libA.so as its dependency.

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

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

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

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

libA files: a.cpp a.h libB files: b.cpp b.h main program files: main.cpp

Конечно, b.cpp включает в себя a.h, а main.cpp включает в себя b.h.

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

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. Но это звучит немного странно для меня.

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

-- Updated comments:

Когда я связываю двоичный файл, компоновщик попытается разрешить все символы из основного и из 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 вариант?

-- Updated comments 2:

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

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

Ответы на вопрос(4)

Ваш ответ на вопрос