Подтвердить что ты не робот

Что такое CMake, эквивалентный "gcc -fvisibility = hidden" при управлении экспортированным символом общей библиотеки?

Я разработал кросс-платформенное программное обеспечение в С++. Как я знаю, Linux.so экспортировал все символы по умолчанию, а через "gcc -fvisibility=hidden" я могу установить все экспортированные символы как скрытые, а затем установить __attribute__(visibility("default")) для класса и функции, которые я хочу экспортировать, поэтому я могу контролировать, что я хотите экспортировать.

Мой вопрос в том, что с помощью CMake, как я могу выполнять работу как "gcc -fvisibility = hidden"?

4b9b3361

Ответ 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)