Почему библиотека не включается в SHARED?
От: Shmj Ниоткуда  
Дата: 13.12.23 07:04
Оценка:
Вопрос такой, промучался 3 дня и сил уже нет.

Есть 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 — ничего не дало.

Пробовал менять порядок в списке той, что не включается. Тоже ничего не дало.

В чем может быть проблема?
Отредактировано 13.12.2023 7:26 Shmj . Предыдущая версия . Еще …
Отредактировано 13.12.2023 7:17 Shmj . Предыдущая версия .
Re: Почему библиотека не включается в SHARED?
От: kov_serg Россия  
Дата: 13.12.23 08:45
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Вопрос такой, промучался 3 дня и сил уже нет.

S>В чем может быть проблема?
Телепаты в отпуске. Нужны детали.
Re[2]: Почему библиотека не включается в SHARED?
От: Shmj Ниоткуда  
Дата: 13.12.23 08:58
Оценка:
Здравствуйте, kov_serg, Вы писали:

S>>Вопрос такой, промучался 3 дня и сил уже нет.

S>>В чем может быть проблема?
_>Телепаты в отпуске. Нужны детали.

Какие именно? Что посмотреть?
Re: Почему библиотека не включается в SHARED?
От: andrey.desman  
Дата: 13.12.23 09:02
Оценка: 8 (2)
Здравствуйте, Shmj, Вы писали:

S>В чем может быть проблема?


google whole-archive

target_link_libraries(mylib PRIVATE -Wl,--whole-archive another_lib -Wl,--no-whole-archive)


если cmake >= 3.24, можешь линковать так:
target_link_libraries(mylib PRIVATE "$<LINK_LIBRARY:WHOLE_ARCHIVE,another_lib>")

https://cmake.org/cmake/help/latest/manual/cmake-generator-expressions.7.html#link-features
Re: Почему библиотека не включается в SHARED?
От: Skorodum Россия  
Дата: 13.12.23 09:09
Оценка: 6 (1)
Здравствуйте, Shmj, Вы писали:

Из статитческий библиотеке включается только то, что явно используется: eсли динамическая библиотека (или приложение) не использует функции из статической, то они не будут включены.

То, то ты хочешь сделать вроде можно сделать вот так:
INTERFACE_LINK_LIBRARIES_DIRECT
cmake
Re[2]: Почему библиотека не включается в SHARED?
От: Shmj Ниоткуда  
Дата: 13.12.23 10:54
Оценка:
Здравствуйте, 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 смотреть. Возможно чуть позже соберу волю в кулак и проверю.
Re[3]: Почему библиотека не включается в SHARED?
От: andrey.desman  
Дата: 13.12.23 11:49
Оценка:
Здравствуйте, Shmj, Вы писали:

S>GPT тоже выдал, но предупредил что не кросс-платформенно.


Кроссплатформенно через $<LINK_LIBRARY:WHOLE_ARCHIVE,another_lib> если версия cmake позволяет.
Re[2]: Почему библиотека не включается в SHARED?
От: K13 http://akvis.com
Дата: 13.12.23 13:38
Оценка:
Здравствуйте, andrey.desman, Вы писали:

AD>google whole-archive


Это про другое.

Когда линкер выкидывает статические объекты, потому что на них никто не ссылается (а конструктор этих объектов что-то регистрирует/инициализирует), такой ключик может помочь.
Но когда линкер при сборке .so НЕ НАХОДИТ символ -- от whole-archive толку нету. Особенно если добавление .a в список линковки решает проблему
Re[3]: Почему библиотека не включается в SHARED?
От: andrey.desman  
Дата: 13.12.23 13:50
Оценка:
Здравствуйте, K13, Вы писали:

K13>Это про другое.


Это про это.

K13>Когда линкер выкидывает статические объекты, потому что на них никто не ссылается (а конструктор этих объектов что-то регистрирует/инициализирует), такой ключик может помочь.


Вот у него никто не ссылается.

K13>Но когда линкер при сборке .so НЕ НАХОДИТ символ -- от whole-archive толку нету. Особенно если добавление .a в список линковки решает проблему


Не находит он не при сборке so, а при использовании so, потому что линкер архив не включил в сошку.
Добавляет к списку линковки он уже к условному бинарю, который использует эту сошку, и тогда работает.
Re[4]: Почему библиотека не включается в SHARED?
От: Shmj Ниоткуда  
Дата: 14.12.23 06:24
Оценка:
Здравствуйте, andrey.desman, Вы писали:

K13>>Это про другое.

AD>Это про это.

Да, оно. Помоглось.
Re[2]: Почему библиотека не включается в SHARED?
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 18.12.23 22:53
Оценка:
Здравствуйте, andrey.desman, Вы писали:

AD>
AD>target_link_libraries(mylib PRIVATE -Wl,--whole-archive another_lib -Wl,--no-whole-archive)
AD>

Ответ хорош, но вопрос остаётся — почему так, а не как мы предполагаем?
Sic luceat lux!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.