Рассмотрим следующий сценарий:
Я хочу скомпилировать бинарный файл, связанный с libB. Должен ли я связать двоичный файл только с libB или с libA?
Есть ли способ связать только с прямыми зависимостями, разрешив разрешение неразрешенных символов из зависимостей во время выполнения?
Меня беспокоит тот факт, что реализация библиотеки libB может измениться в будущем, введя другие зависимости (например, libC, libD, libE). Будут ли у меня проблемы с этим?
Другими словами:
Конечно, 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
выглядит намного лучше.
Еще раз спасибо.