不要在自己的静态库中公开已使用库中的符号

我正按照此处提供的说明为iPhone编写可重复使用的静态库。

我想在内部使用minizip ,但不想将它暴露给用户。

用户应该可以自己包括minizip,可能是不同的版本,并且不会导致与我的“内部”迷你剪辑版本发生冲突。

这可能吗?

编辑:

我已经尝试将-fvisibility=hidden添加到minizip文件的其他编译器标志,并将函数更改为__private_extern____attribute__((visibility("hidden"))) ,但它似乎仍然生成定义的外部符号:

 00000918 T _unzOpen 0000058e T _unzOpen2 00001d06 T _unzOpenCurrentFile 00001d6b T _unzOpenCurrentFile2 ... 

编辑#2:

显然,标记有这些注释的符号仅由链接器设为私有,这在Xcode构建源时不会发生,因为它添加了-c参数(“编译或汇编源文件,但不链接。”)

您可以使用objcopy重命名minizip所有导出符号。

就像是

 objcopy -redefine-sym=minizip.syms yourstaticlibray.a 

minizip.syms

 _unzOpen _yourownprefix_unzOpen _unzOpen2 _yourownprefix_unzOpen2 ... ... 

如果可执行文件与其他minizip.ayourstaticlibray.a ,并且因为您重命名了yourstaticlibray.a所有符号,则在yourstaticlibray.a调用minizip将使用带前缀的符号,而不是unzOpen符号。

由于静态库只不过是一组.o文件(尚未链接,正如你所提到的),完全隐藏外部世界minizip存在的唯一方法是以某种方式将minizip和你的库一起编译为单个编译单元并使minizip函数/变量静态。

您可以看看SQLite如何进行“合并”过程,将库源代码转换为单个.c文件以进行进一步编译: SQLite Amalgamation 。

作为奖励,您将获得更好的优化(实际上最近的GCC和Binutils能够进行链接时优化,但此function尚未发布)。