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

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.ayourstaticlibray.a,因为你在改名的所有符号yourstaticlibray.a您的通话中yourstaticlibray.a,以minizip将使用前缀符号,而不是unzOpen之一.


dot*_*mag 5

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

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

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


归档时间:

查看次数:

7506 次

最近记录:

16 年 前