我正按照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参数(“编译或汇编源文件,但不链接。”)
答案 0 :(得分:10)
您可以使用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
至{{1},则不会发生冲突将使用带前缀的符号,而不是unzOpen符号。
答案 1 :(得分:4)
由于静态库只不过是一组.o文件(尚未链接,正如您所提到的),从外部世界完全隐藏minizip存在的唯一方法是以某种方式编译minizip和您的库作为单个编译单元一起使minizip函数/变量静态。
您可以看看SQLite如何执行“合并”过程,将库源代码转换为单个.c文件以进行进一步编译:The SQLite Amalgamation。
作为奖励,您将获得更好的优化(实际上最近的GCC和Binutils能够进行链接时优化,但此功能尚未发布)。