自动隐藏私人符号

时间:2018-06-24 12:58:58

标签: c++ makefile build linker

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

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

给出以下项目结构:

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

是否可以自动隐藏include/*.h中未出现的所有符号?

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

2 个答案:

答案 0 :(得分:1)

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

有关更多详细信息,您可能需要阅读symbol visibility上的gcc文章。

答案 1 :(得分:0)

  

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

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

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

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