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