Jyuuroku Blog
Published on

静态库链接问题

Authors

静态库是按需链接的

下面的内容基于Podfile中的 use_frameworks! 注释掉默认使用静态库

之所以pod库之后无论是否调用pod库函数都会进行连接,原因在于cocopods在编译参数加了_ObjC,使得不调用pod库函数也会全部链接,在Pods-TargetName.debug.xcconfig文件中去掉-ObjC编译参数,就会发现符合静态库按需连接的理论,只要不调用pod库的函数,linkmap的Object files文件就不会出现对应的pod文件;

OTHER_LDFLAGS = $(inherited) -ObjC -l"SVProgressHUD" -framework "QuartzCore"

主要的原因是cocopods在注释掉 use_frameworks! 默认使用静态库后,会在上述地方添加-ObjC编译参数,编译期会链接pod库,无论是否调用相关函数;cocopods防止使用静态库按需连接在runtime找不到方法以及防止category找不到对应pod库

官方默认就是不加该参数的,官方的解释如下:

But it can make the resulting executable larger, and may pickup unnecessary objects

所以如果使用cocopods导入静态库的情况下,可以选择去掉-ObjC编译参数提升编译性能

解决问题

所以这也就能解释为什么即使注释掉 use_frameworks! 重新pod install依旧会全部链接的问题

还有就是一开始为什么调用还是不调用都不链接,因为cocopods默认使用use_frameworks!表示使用动态库,动态库的加载是执行中动态加载的,不是编译期的,所以无论是否调用都不会对相关类进行连接

动态库是加载app时交给dyld链接的

动态库不能依赖静态库

动态库不能依赖静态库是因为静态库不需要在运行时再次加载,如果多个动态库依赖同一个静态库,会出现多个静态库的拷贝,而这些拷贝本身只是对于内存空间的消耗