一、简介
目前ios制作对外输出的动态库,静态库越来越方便,伴随而来的问题也也越来越少,本次就打包Framework过程做下记录(不涉及xcodebuild调用过程)
二、简述lipo
lipo源于mac系统要制作兼容powerpc平台和intel平台的程序,lipo 是一个在 Mac OS X 中处理通用程序(Universal Binaries)的工具,主要用于查看,修改Mac OS X 中的通用程序。
(a)查看frameWork支持架构
lipo -info xxx.framework/xxx
输出结果:Architectures in the fat file: xxx.framework/xxx are: i386 x86_64 armv7 arm64
(b)合并framework
lipo -create xxx(i386).framework/xxx xxx(armv7).framework/xxx -output xxx.framework.xxx
说明:通过编译产生的动态库/静态库,均为单一架构支持(模拟器/真机),其中i386和x86_64均为模拟器架构,armv7和arm64为真机架构,通过合并产生的framework才是全架构支持
(c)拆分framework
lipo xxx.framework/xxx -thin i386 xxx.i386
说明:次操作将单独分离出仅支持i386的动态库/静态库文件, x86_64 armv7 arm64可同理分离,可以配合合并操作去除不需要的架构支持,用于动态库/静态库瘦身。
三、简述ar操作
ar是linux提供的维护链接编辑器使用的索引库
1. 要创建一个库,请输入:
ar -v -q lib.a strlen.o strcpy.o
如果 lib.a 库不存在,则此命令创建它,并将文件 strlen.o 和 strcpy.o 的副本输入其中。如果 lib.a 库存在,则此命令在不检查相同成员的情况下,将新的成员添加到末尾。v 标志设置详细方式,在此方式中 ar 命令在其进行时显示进程报告。
2. 要显示库的目录,请输入:
ar -v -t lib.a
此命令列出了 lib.a 库的目录,显示类似于 ls -l 命令的输出的长列表。要只列出成员文件名称,则省略 -v 标志。
3. 要替换或添加新成员到库中,请输入:
ar -v -r lib.a strlen.o strcat.o
此命令替换成员 strlen.o 和 strcat.o。如果 lib.a 如示例 1 中显示的那样创建,则替换 strlen.o 成员。因为不存在名为 strcat.o 的成员,所以它被添加到库的末尾。
4. 要指定在何处插入新成员,请输入:
ar -v -r -b strlen.o lib.a strcmp.o
此命令添加 strcmp.o 文件,并将该新成员置于 strlen.o 成员之前。
5. 要更新一个已经更改过的成员,请输入:
ar -v -r -u lib.a strcpy.o
此命令替换现有 strcpy.o 成员,但仅当文件 strcpy.o 自从最后一次添加到库后已经修改时才替换它。
6. 要更改库成员的顺序,请输入:
ar -v -m -a strcmp.o lib.a strcat.o strcpy.o
此命令将成员 strcat.o 和 strcpy.o 移动到紧跟在 strcmp.o 成员之后的位置。保留 strcat.o 和 strcpy.o 成员的相对顺序。换句话说,如果在移动之前 strcpy.o 成员在 strcat.o 成员之前,那么(移动后)它依旧如此。
7. 要解压缩库成员,请输入:
ar -v -x lib.a strcat.o strcpy.o
此命令将成员 strcat.o 和 strcpy.o 分别复制到名为 strcat.o 和 strcpy.o 的文件。
8. 要解压缩并重命名一个成员,请输入:
ar -p lib.a strcpy.o >stringcopy.o
此命令将成员 strcpy.o 复制到一个名为 stringcopy.o 的文件。
9. 要删除一个成员,请输入:
ar -v -d lib.a strlen.o
此命令从 lib.a 库中删除成员 strlen.o。
10. 要从多个用 ld 命令创建的共享模块中创建一个压缩文档库,请输入:
ar -r -v libshr.a shrsub.o shrsub2.o shrsub3.o ...
此命令从名为 shrsub.o、shrsub2.o、shrsub3.o 等等的共享模块中创建名为 libshr.a 的压缩文档库。要编译并链接使用 libshr.a 压缩文档库的 main 程序,请使用以下命令:
cc -o main main.c -L/u/sharedlib -lshr
main 程序现在是可执行的。main 程序引用的任何符号(包含在libshr.a 压缩文档库中)已经因延迟分辨率而作了标记。-l 标志指定应在 libshr.a 库中搜索这些符号。
11. 要列出 lib.a 的内容(忽略任何 32 位目标文件),请输入:
ar -X64 -t -v lib.a
12. 要从 lib.a 解压缩所有 32 位的目标文件,请输入:
ar -X32 -x lib.a
13. 要列出 lib.a 中的所有文件,无论是 32 位、64 位或非对象,请输入:
ar -X32_64 -t -v lib.a
四、简述nm操作
nm 命令被用于显示二进制目标文件的符号表
语法
nm(选项)(参数)
举例:
nm View.o>View.m
nm -A View.o
说明:
选项:[-A:每个符号前显示文件名;-D:显示动态符号;-g:仅显示外部符号;-r:反序显示符号表。]
参数:目标文件,二进制目标文件,通常是库文件和可执行文件