我有一个带有公共和私有头文件的C ++项目。 为了增加封装并减少大型项目中的符号冲突,我只想导出最少的符号集。
尽管我们可以使用可见性属性手动注释每个函数,但我更喜欢不需要更改源代码的方法。
给出以下项目结构:
LibA
include
*.h
src
*.h
*.cpp
是否可以自动隐藏include/*.h
中未出现的所有符号?
是否有一种优雅的方式来编译编译器/链接器? 我们可以自动生成一个版本脚本吗?
答案 0 :(得分:1)
使用gcc和clang,就像使用-fvisibility=hidden
构建一样简单。然后,您只需显式导出要公开的几个公共符号即可。
有关更多详细信息,您可能需要阅读symbol visibility上的gcc文章。
答案 1 :(得分:0)
我们可以自动生成一个版本脚本吗?
您肯定可以:运行nm -C *.o | egrep ' [TDBW] '
获取全局符号列表,然后查看include/*.h
以查看应导出的符号。这可能很脆弱:例如使用宏来生成符号名称,这可能根本不起作用。
可能值得一次生成列表,手动整理列表,然后在修订控制系统中手动将其与源一起维护。
如果要导出的符号数量相对较少,则使用-fvisibility-hidden
进行编译并仅对公共符号进行注释是一种更可靠的解决方案。