Linux с
set(CMAKE_C_VISIBILITY_PRESET hidden)
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
set(CMAKE_VISIBILITY_INLINES_HIDDEN 1)
Для всего публичного API использую Q_DECL_EXPORT и почти всё хорошо.
Кроме того, что в выводе nm --extern-only есть две приватные структуры.
При этом подобных структур в коде ещё штук десять.
Ручное добавление Q_DECL_HIDDEN к этим структурам решает проблему, но я не могу понять, почему символы экспортировались и как можно этого избежать не прописывая hidden.
Экспортируется Message::Private и FileInfo::Private. Другие подобные структуры (MessageMediaInfo::Private и т.д.) следуют указанным настройкам и не экспортируются.
https://github.com/Kaffeine/telegram-qt/blob/master/TelegramQt/TelegramNamespace.hpp#L271
https://github.com/Kaffeine/telegram-qt/blob/master/TelegramQt/TelegramNamespace_p.hpp#L41
Почему могут экспортироваться символы, не отмеченные __attribute__((visibility("default"))) при сборке gcc с -fvisibility=hidden -fvisibility-inlines-hidden?
сделай CMAKE_EXPORT_COMPILE_COMMANDS ON и посмотри, не перекрываются ли у тебя -fvisibility=hidden
Обсуждают сегодня