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