Связывание с динамической библиотекой с зависимостями
Рассмотрим следующий сценарий:
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
подход выглядит намного лучше.
Еще раз спасибо.