您需要GCC 的可见性属性扩展。
实际上,类似:
#define MODULE_VISIBILITY __attribute__ ((visibility ("hidden"))) #define PUBLIC_VISIBILITY __attribute__ ((visibility ("default")))(您可能想要
#ifdef上面的宏,使用一些配置技巧àla
autoconf和其他 自动工具 ;在其他系统上,您将只有空的定义,如
#definePUBLIC_VISIBILITYetc …)
然后,声明一个变量:
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或没有共享库,它将无法正常工作。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。也许其他一些编译器(
clang来自LLVM)也可能支持
Linux上 的 共享库 (不是静态 库
)。实际上,真正的隐藏(针对单个共享库的多个编译单元)主要是由链接程序完成的(因为ELF共享库允许这样做)。



