Jak*_*čar 15 c iphone objective-c
我正按照此处提供的说明为iPhone编写可重复使用的静态库.
我想minizip在内部使用我的库,但不想将它暴露给用户.
用户应该可以自己包含minizip,可能是不同的版本,并且不会导致与我的"内部"迷你剪辑版本发生冲突.
这可能吗?
编辑:
我已经尝试-fvisibility=hidden为minizip文件添加额外的编译器标志并将函数更改为__private_extern__和__attribute__((visibility("hidden"))),但它似乎仍然生成定义的外部符号:
00000918 T _unzOpen
0000058e T _unzOpen2
00001d06 T _unzOpenCurrentFile
00001d6b T _unzOpenCurrentFile2
...
Run Code Online (Sandbox Code Playgroud)
编辑#2:
显然,标记有这些注释的符号仅由链接器设为私有,这在Xcode构建源时不会发生,因为它添加了-c参数("编译或汇编源文件,但不链接.")
Nim*_*lar 10
您可以minizip使用objcopy 重命名所有导出的符号.
就像是
objcopy -redefine-sym=minizip.syms yourstaticlibray.a
Run Code Online (Sandbox Code Playgroud)
和 minizip.syms
_unzOpen _yourownprefix_unzOpen
_unzOpen2 _yourownprefix_unzOpen2
... ...
Run Code Online (Sandbox Code Playgroud)
没有如果可执行文件与其他链接的冲突minizip.a和yourstaticlibray.a,因为你在改名的所有符号yourstaticlibray.a您的通话中yourstaticlibray.a,以minizip将使用前缀符号,而不是unzOpen之一.
由于静态库只不过是一组 .o 文件(正如您所提到的,尚未链接),因此从外界完全隐藏 minizip 存在的唯一方法是以某种方式将 minizip 和您的库一起编译为单个编译单元并使 minizip 函数/变量静态。
您可以看看 SQLite 如何执行“合并”过程,将库源代码转换为单个 .c 文件以供进一步编译:SQLite Amalgamation。
作为奖励,您将获得更好的优化(最近的 GCC 和 Binutils 能够进行链接时优化,但此功能尚未发布)。
| 归档时间: |
|
| 查看次数: |
7506 次 |
| 最近记录: |