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

时间:2009-10-21 16:12:08

标签: iphone c objective-c

我正按照here提供的指示为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参数(“编译或汇编源文件,但不链接。”)

2 个答案:

答案 0 :(得分:10)

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

类似

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

minizip.syms

_unzOpen     _yourownprefix_unzOpen
_unzOpen2    _yourownprefix_unzOpen2
...          ...

如果可执行文件与其他minizip.ayourstaticlibray.a相关联,并且您将yourstaticlibray.a内的所有符号重命名为yourstaticlibray.a至{{1},则不会发生冲突将使用带前缀的符号,而不是unzOpen符号。

答案 1 :(得分:4)

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

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

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