如何使用gcc在CMake中正确设置可见性属性?

时间:2018-10-19 01:13:41

标签: gcc cmake

我尝试了几个选项来正确设置库中的可见性。喜欢:

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 :(得分:0)

我认为您正在寻找:

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