您需要 GCC 的可见性属性扩展。
实际上,类似于:
#define MODULE_VISIBILITY __attribute__ ((visibility ("hidden")))
#define PUBLIC_VISIBILITY __attribute__ ((visibility ("default")))
(您可能想要#ifdef
上述宏,使用一些配置技巧 à laautoconf
和其他自动工具;在其他系统上,您只会有空定义,如#define PUBLIC_VISIBILITY /*empty*/
etc...)
然后,声明一个变量:
int module_var MODULE_VISIBILITY;
或函数
void module_function (int) MODULE_VISIBILITY;
然后您可以在共享库内部使用module_var
或调用,但不能在外部使用。module_function
另请参见 GCC 的-fvisibility代码生成选项。
顺便说一句,您也可以像往常一样编译-Dsomeglobal=alongname3419a6
和使用整个库;someglobal
要真正找到它,您的用户需要将相同的预处理器定义传递给编译器,并且您可以使名称alongname3419a6
随机且不太可能,以使冲突不太可能发生。
PS。这种可见性是GCC 特有的(并且可能是 ELF 共享库,例如 Linux 上的那些)。如果没有 GCC 或共享库之外,它就无法工作......所以它是非常特定于 Linux 的(即使其他一些系统,可能是带有 GCC 的 Solaris,也有它)。可能其他一些编译器(clang
来自LLVM)也可能支持Linux上的共享库(不是静态库)。实际上,真正的隐藏(对单个共享库的几个编译单元)主要由链接器完成(因为ELF共享库允许这样做)。