- Published on
静态库链接问题
- Authors
- Name
- Jyuuroku Wu
- @wwzzyying
静态库是按需链接的
下面的内容基于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链接的
动态库不能依赖静态库
动态库不能依赖静态库是因为静态库不需要在运行时再次加载,如果多个动态库依赖同一个静态库,会出现多个静态库的拷贝,而这些拷贝本身只是对于内存空间的消耗