Target和Mach-O的Link命令
对于不同的Target,例如常见的 StaticLibrary 和 DynamicLibrary 以及 Executable 其Mach-O文件使用的Link命令也是不同的
通过Xcode的日志查询文件 Report Navigator可以看到具体过程
StaticLibrary,Target=lib.a
查看在Run lib.a的时候调用的命令 libtool 完成的链接过程,并且把这一个过程称为 Create static Library
1 | XcodeDefault.xctoolchain/usr/bin/libtool -static ..... |
DynamicLibrary,Target=lib.framework
而在对 lib.framework 的时候调用的命令 clang 完成了链接过程 并且与Static不同,其把过程称为Link, 并且加载了一堆 Xlinker 指令,
1 | XcodeDefault.xctoolchain/usr/bin/clang ...... |
Executable,Target=demo.app
而在对 demo.app Link时 同样是调用的命令 clang 完成了链接过程, 具体参数与 DynamicLibrary 有一些不同
1 | XcodeDefault.xctoolchain/usr/bin/clang ...... -filelist ..... -Xlinker .... |
参数说明
具体说明可以使用 man clang 来查看,仅列举上文出现的
参数 | 备注 |
---|---|
-arch_only,-arch | 生成的架构 |
-syslibroot | 系统库System Library Root |
-dynamiclib | 生成动态库 |
-filelist | 要执行的File列表 |
-o | 输出文件 |
-dead_strip | 文章03中提到的Strip过程等级 |
-Xlinker | 对Link过程中的参数输入 |
区别与总结
Static可以看到.o的原因
由本系列文章第四章模块化04符号表可以知道Static Library和Dynamic Library的符号表是不一样的,Static可以看到.o文件的原因就是使用 libtool 命令进行create
Duplicated Symbols
而Executable 和 DynamicLibrary 在Clang指令的-Xlinker 列表中存在一个重要的指令 -Xlinker -no_deduplicate 代表不能存在重复的符号
但是在Create Static中不存在该输入,而且每个.o文件都是分开的,所以说Static Create并不能进行重复符号的检查
通过Dulpicated错误验证
通常情况下,存在如下两个类,而且全部处于同一个Target的Source Files里,因为类名相同必然会报错,参考编译错误duplicate symbols
1 |
|
但是通过对target.a进行Run,仍然可以得到Build Success,也就是说libtool命令进行Create通过
Create != Link
也就是说在不同的Target情况,使用的Link指令存在差别,并且静态库被称为Create而不是真正的Link,所以不会做Duplicated的符号检查