Как правильно установить свойство видимости в CMake с gcc? - PullRequest
0 голосов
/ 19 октября 2018

Я попробовал несколько вариантов, чтобы правильно настроить видимость в моей библиотеке.Как:

target_compile_options(MY_LIB PRIVATE "-fvisibility=hidden")
set_target_properties(MY_LIB PROPERTIES C_VISIBILITY_PRESET hidden VISIBILITY_INLINES_HIDDEN 1)
set_target_properties(MY_LIB PROPERTIES CXX_VISIBILITY_PRESET hidden VISIBILITY_INLINES_HIDDEN 1)

или

SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")

И оба не работают.У меня есть определенные функции, которые я хочу выставить, установленные внутри блока

#pragma GCC visibilty push(default)
  void thisShouldBeTheOnlyThingVisible(void) {
    ...
  }
#pragma GCC visibilty pop

Но, если я запускаю разные инструменты, такие как objdump или readelf , не толькоЯ вижу все внутренние функции, которые не должны быть перечислены, я также вижу имена файлов и имена не статических переменных.Я бы не возражал в режиме debug , но в release его там не должно быть.

Какой правильный процесс здесь, чтобы получить все, что я хочу скрытькроме этих специальных функций?

Спасибо

W

1 Ответ

0 голосов
/ 03 июня 2019

Я думаю, что вы ищете:

add_library(MY_LIB ${MY_SOURCES})
set_property(TARGET MY_LIB PROPERTY C_VISIBILITY_PRESET hidden)
set_property(TARGET MY_LIB PROPERTY VISIBILITY_INLINES_HIDDEN ON)

По крайней мере, начиная с cmake 3.14.4.

Определил это, посмотрев тест CMake:

https://github.com/Kitware/CMake/blob/master/Tests/Visibility/CMakeLists.txt

...