【问题标题】:hide private symbols automatically自动隐藏私有符号
【发布时间】:2018-12-03 05:51:30
【问题描述】:

我有一个包含公共和私有头文件的 C++ 项目。 为了在更大的项目中增加封装并减少符号冲突,我想只导出最小的符号集。

虽然我们可以使用可见性属性手动注释每个函数,但我更喜欢不需要更改源代码的方法。

给定以下项目结构:

LibA
  include
    *.h
  src
    *.h
    *.cpp

有没有办法自动隐藏所有未出现在include/*.h 中的符号?

是否有一种优雅的方式来检测编译器/链接器? 我们可以自动生成版本脚本吗?

【问题讨论】:

  • 您使用的是哪个编译器/链接器?
  • 主要clang、gcc和ld。

标签: c++ makefile build linker


【解决方案1】:

使用 gcc 和 clang,这就像使用 -fvisibility=hidden 构建一样简单。然后,您只需要显式导出您想要公开的几个公共符号。

更多详情,symbol visibility 上有一篇 gcc 文章,您可能想阅读。

【讨论】:

  • 谢谢,但这需要更改源代码才能公开符号。你知道任何不需要改变来源的方法吗?
  • @Gaetano 对不起,没有。
【解决方案2】:

我们可以自动生成版本脚本吗?

您当然可以:运行nm -C *.o | egrep ' [TDBW] ' 以获取全局符号列表,然后查看include/*.h 以查看应导出哪些符号。这可能很脆弱:如果你例如使用宏来生成符号名称,这可能根本不起作用。

生成一次列表,手动整理它,然后在修订控制系统中手动将其与源一起维护可能是值得的。

如果要导出的符号数量相对较少,则使用 -fvisibility-hidden 编译并仅注释公共符号是一种更稳健的解决方案。

【讨论】:

    猜你喜欢
    • 2012-02-28
    • 2012-07-06
    • 2018-06-05
    • 2012-06-07
    • 1970-01-01
    • 2010-11-29
    • 2012-01-12
    • 2012-01-12
    • 2016-09-20
    相关资源
    最近更新 更多