在同一个文件中,如果有一些函数我们并不想要让外部访问,我们通常会添加 static 修饰符,把它设置为内部链接属性。
static void foo();
但是通常库不太可能是单文件组成,这些文件中有些是做接口给外部使用,有些则单纯的只是库的内部实现。对于外部使用者来说,内部实现的这些符号没有实际的作用,理论上我们完全可以像对待文件内部符号一样把它们统统隐藏掉。但是在语言层面我们并没有相关的语法用于表达这个概念(Java中的包访问权限和C#中的internal类似这个概念)。不同的编译器提供了不同的方式来完成这件事情,这篇文章总结了一种跨平台的处理方式。
一般来说做符号隐藏有以下三个作用:
符号隐藏可以采用下面几个步骤(文中假定你使用MSVC或者4.0以上版本的GCC,低版本GCC不支持符号隐藏):
符号能否隐藏在于它在动态链接的过程中是否需要用到。静态库实际上是目标文件的集合,它并没有完成链接过程。所以符号隐藏通常都是基于动态库的,静态库的符号隐藏没有很好的跨平台方式,如果想要