Что такое CMake, эквивалентный "gcc -fvisibility = hidden" при управлении экспортированным символом общей библиотеки?
Я разработал кросс-платформенное программное обеспечение в С++. Как я знаю, Linux.so экспортировал все символы по умолчанию, а через "gcc -fvisibility=hidden"
я могу установить все экспортированные символы как скрытые, а затем установить __attribute__(visibility("default"))
для класса и функции, которые я хочу экспортировать, поэтому я могу контролировать, что я хотите экспортировать.
Мой вопрос в том, что с помощью CMake, как я могу выполнять работу как "gcc -fvisibility = hidden"?
Ответы
Ответ 1
Вместо того, чтобы устанавливать флаги компилятора напрямую, вы должны использовать текущую версию CMake и <LANG> _VISIBILITY_PRESET. Таким образом, вы можете избежать специфики компилятора в своих CMakeLists и улучшить кросс-платформенную применимость (избегая ошибок, таких как поддержка GCC, а не Clang).
I.e., если вы используете С++, вы либо вызываете
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
, чтобы установить свойство глобально или set_target_properties(MyTarget PROPERTIES CXX_VISIBILITY_PRESET hidden)
, чтобы ограничить установку определенной библиотекой или исполняемой целью. Если вы используете C, замените CXX на C в вышеупомянутых командах. Вы также можете изучить свойство VISIBLITY_INLINES_HIDDEN.
Документация для GENERATE_EXPORT_HEADER содержит еще несколько советов и примеров, связанных с обоими свойствами.
Ответ 2
Вы можете добавить флаг в компилятор Cmake следующим образом:
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
Чтобы убедиться, что это сделано только под Linux, вы можете использовать этот код:
IF(UNIX)
IF(CMAKE_COMPILER_IS_GNUCC)
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
ENDIF(CMAKE_COMPILER_IS_GNUCC)
ENDIF(UNIX)