Розглянемо такий сценарій:
- Спільна бібліотека 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. Але мені це звучить трохи дивно.
Дуже дякую.
- Оновлені коментарі:
Коли я зв'язую двійковий файл, компонувальник намагатиметься вирішити всі символи з основного та 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
Підхід виглядає набагато краще.
Знову дякую.