在GCC中可以使用visibility属性控制符号是否导出到动态库中。
如果多个动态库中包含相同符号(例如同一个库的不同版本),则C++会按照链接顺序中第一个包含该符号的动态库为准。如果提供的链接顺序不符合预期,就会导致未定义行为。当然,想要同时调用多个动态库中相同符号的函数肯定是不行的。(单一定义规则)
使用-fvisibility=hidden
编译选项可以默认隐藏所有符号,除了显示通过default进行暴露的。
1 | __attribute__((__visibility__("default"))) // -fvisibility=hidden |
注:visibility的可见性以一个共享库为单位(used only within a shared library),而static则以一个编译文件为单位(used only within a compile unit),也就是static会更加严格。hidden符号是对同一个共享库中的其它文件可见的。