【问题标题】:How to properly set the visibility property in CMake with gcc?如何使用 gcc 在 CMake 中正确设置可见性属性?
【发布时间】:2018-10-19 01:13:40
【问题描述】:

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

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

【问题讨论】:

    标签: gcc cmake


    【解决方案1】:

    我想你正在寻找:

    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

    【讨论】:

      猜你喜欢
      • 2019-10-06
      • 2015-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-23
      • 2015-03-15
      • 2021-11-15
      相关资源
      最近更新 更多