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

3

我尝试了几种方法来正确设置我的库中的可见性。例如:

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

然而,如果我运行不同的工具,比如objdumpreadelf,不仅会看到所有不应列出的内部函数,还会看到文件名和非静态变量名。在debug模式下无所谓,但在release模式下,这些信息不应该存在。

在这里,获得隐藏除了那些特殊函数之外的所有内容的正确流程是什么?

谢谢

W

1个回答

4
我认为你在寻找的是:

我想你正在寻找:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接