这个问题之前已经被问到,但是挖掘到各种开发工具的文档,看起来像这样是可能,只是不明显。如何在没有公开所有符号的情况下为iOS创建静态库
动机: 其他iOS开发制作中使用的静态库。如果导出库中的某些符号会导致问题,所以我希望将它们作为内部符号。随着一个动态库,这是很容易,只需使用-exported_symbols_list
libtool
(ld
)参数,并列出要公开的人。 libtool
文档不会允许这种说法的静态库。
图书馆有使用代码相互几个的ObjectiveC .m文件。只有组中的一个类需要向最终的.a静态库文件的用户公开。
尝试了libtool -exported_symbols_list publicsymbols.exp
但libtool
的论点不支持-static
静态库。
不能使符号与私有属性(如果那会甚至工作),因为它们是由该组中的其他.m文件需要。
看起来像ld
可能需要几个.o文件,并将它们连接成一个新的.o文件(通过-r
参数),它并没有为-exported_symbols_list
参数“动态只有”声明(这可能仅仅是不清楚的文件...)。
只是作为一个测试,我建我的Xcode项目,所以我都.o文件制作,然后再尝试调用ld
在命令行中,就像这样:
ld -r -x -all_load -static -arch armv6 -syslibroot {path}
-filelist /Users/Dad/ABCsdk/iphone-ABClib/build/ABCLib.build/Distribution-iphoneos/ABCLib-device.build/Objects-normal/armv6/ABCsdk.LinkFileList
-exported_symbols_list {exp file path} -o outputfile.o
其中{}路径类型的东西有很长的路径到那里的适当的地方。
,但我得到类似下面的错误:
在/ usr/bin中/ ld_classic:/Users/Dad/ABCsdk/iphone-ABClib/build/ABCLib.build/Distribution-iphoneos/ABCLib-device。建立/对象 - 正常/的ARMv6/ABCmain.o不相容,文件包含不支持的类型在负荷命令0第3(_ TEXT, _picsymbolstub4)的(必须指定 “-dynamic” 被使用)
所以有些事情似乎不对劲的地方......
任何人都知道一个聪明的方法来完成这项工作?谢谢。
你需要隐藏什么样的符号? – Macmade
符号如果他们有相同的子库已经链接到他们的应用程序可能会冲突(JSONkit说)。显然,我可以包含JSONKit文件,并说如果它们还不在您的项目中,也可以包含它们,但我希望将一个.h文件和.a文件添加到项目中以实现更清洁的集成。 – Dad