Есть CMake-файл, там описана сборка SHARED-библиотеки. В нее включается много мелких библиотек с помощью target_link_libraries.
Мелкие библиотеки все статические — libmylib.a. Итоговая библиотека — SHARED — .so для Android и .dylib для macOS и iOS.
Так вот, один и тот же CMakeList файл — для iOS собирает библиотеку и она работает. Для Android — не видит символов.
Вот что сделал — вручную начал подключать эти мелкие .a библиотеки к проекту — и выявил что пару библиотек оно не включило в итоговый .so -файл. Ну взяло и не включило, хотя в target_link_libraries они указаны наряду с остальными. Если их вручную скопировать (эти .a-файлы) а так же указать в target_link_libraries для итогового проекта — то символы находит и итоговый проект собирается.
Пробовал добавить PUBLIC в target_link_libraries — ничего не дало.
Пробовал менять порядок в списке той, что не включается. Тоже ничего не дало.
Из статитческий библиотеке включается только то, что явно используется: eсли динамическая библиотека (или приложение) не использует функции из статической, то они не будут включены.
Здравствуйте, andrey.desman, Вы писали:
AD>google whole-archive
GPT тоже выдал, но предупредил что не кросс-платформенно.
add_library(your_shared_library SHARED source1.cpp source2.cpp) # Создание вашей shared библиотеки
# Для линковки статических библиотек с флагами --whole-archive и --no-whole-archive
target_link_libraries(your_shared_library
-Wl,--whole-archive
path_to_static_lib1.a # путь к вашей статической библиотеке
path_to_static_lib2.a # путь к другой статической библиотеке
-Wl,--no-whole-archive
)
# Добавление остальных библиотек
target_link_libraries(your_shared_library
other_libraries
)
Пока нет сил проверить, уже не могу на CMake смотреть. Возможно чуть позже соберу волю в кулак и проверю.
Здравствуйте, andrey.desman, Вы писали:
AD>google whole-archive
Это про другое.
Когда линкер выкидывает статические объекты, потому что на них никто не ссылается (а конструктор этих объектов что-то регистрирует/инициализирует), такой ключик может помочь.
Но когда линкер при сборке .so НЕ НАХОДИТ символ -- от whole-archive толку нету. Особенно если добавление .a в список линковки решает проблему
Это про это.
K13>Когда линкер выкидывает статические объекты, потому что на них никто не ссылается (а конструктор этих объектов что-то регистрирует/инициализирует), такой ключик может помочь.
Вот у него никто не ссылается.
K13>Но когда линкер при сборке .so НЕ НАХОДИТ символ -- от whole-archive толку нету. Особенно если добавление .a в список линковки решает проблему
Не находит он не при сборке so, а при использовании so, потому что линкер архив не включил в сошку.
Добавляет к списку линковки он уже к условному бинарю, который использует эту сошку, и тогда работает.