不要在自己的静态库中公开已使用库中的符号
我正按照此处提供的说明为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.a
和yourstaticlibray.a
,并且因为您重命名了yourstaticlibray.a
所有符号,则在yourstaticlibray.a
调用minizip
将使用带前缀的符号,而不是unzOpen符号。
由于静态库只不过是一组.o文件(尚未链接,正如你所提到的),完全隐藏外部世界minizip存在的唯一方法是以某种方式将minizip和你的库一起编译为单个编译单元并使minizip函数/变量静态。
您可以看看SQLite如何进行“合并”过程,将库源代码转换为单个.c文件以进行进一步编译: SQLite Amalgamation 。
作为奖励,您将获得更好的优化(实际上最近的GCC和Binutils能够进行链接时优化,但此function尚未发布)。