1.两个库都是动态库(.framework)
例如我有个A.framework 和 B.framework,A、B中使用了同样的代码。把这两个framework放到一个项目中运行会有警告,但是不影响。
-
注意1
:向外暴露的类(设置为Public),如果A、B都有个FHTest01类设置为Public,则FHTest01的执行与TARGETS
->Build Phases
->Link Binary With Libraries
中的添加顺序有关,永远执行顺序在前面的那个.framework里的FHTest01的代码。 -
注意2
:没有向外暴露的类(设置为Project或Private),会各自执行代码,没有影响。
验证Demo下载地址:https://gitee.com/ayangcool100/same-class-framework-demo.git
2.一个静态库(.a 或者.framework),一个动态库
把这两个framework放到一个项目中运行,代码执行与TARGETS
->Build Phases
->Link Binary With Libraries
中顺序有关
- 动态库在静态库前面,则只会运行动态库中的三方代码。
- 静态库在动态库前面,则程序能正常运行(有些情况不行),且静态库与动态库里面的三方库代码能各自运行。(动态库中的三方代码只有动态库内代码调用才会运行,如果直接在demo中调用,则运行的是静态库中的三方代码)
3.两个库都是静态库(.a 或者.framework)
例如我有个A.framework 和 B.framework,A、B中使用了同样的代码(例如:AFN),现在项目中需要用到A、B两个库,编译的时候会报错。提示重复链接,解决方案就是从A或者B中删除掉一个AFN代码。现在从A中删除,假设A就是TXLiteAVSDK_Professional.framework
4.动态库A.framework中包含了静态库B.framework
此时编译出来的A的mach-o里面会包含B的代码。把A放到项目中可以正常运行。如果项目中也想直接调用B的代码,因为B已经被A包含进去了,解决方案是直接把B也添加到项目中,但是要注意在Build Phases里,A要在B的前面。
删除重复的代码
1.先查看TXLiteAVSDK_Professional.framework支持的架构:
可以把TXLiteAVSDK_Professional.framework理解成一个文件夹,内部结构如下:
先cd进入TXLiteAVSDK_Professional.framework内
cd TXLiteAVSDK_Professional.framework/
然后
ls
看到目录结构如下:
Headers Modules
Info.plist TXLiteAVSDK_Professional
查看TXLiteAVSDK_Professional支持的架构:
lipo -info TXLiteAVSDK_Professional
发现支持4种架构:
Architectures in the fat file: TXLiteAVSDK_Professional are: armv7 i386 x86_64 arm64
现在把4种架构单独拆出来:(这是拆arm64,其他类似,arm64修改为x86_64)
lipo -thin arm64 TXLiteAVSDK_Professional -output TXLiteAVSDK_Professional_arm64.a
然后查看打包的.o
最好新建个文件夹:arm64
把TXLiteAVSDK_Professional_arm64.a移动到arm64文件夹中,然后:
cd arm64
ar -x TXLiteAVSDK_Professional_arm64.a
就会看到arm64文件夹中有很多.o文件,删除想删除的文件即可。
2.有时候执行ar -x TXLiteAVSDK_Professional_arm64.a 会提示 Inappropriate file type or format 这是因为当前的文件是动态库,是MACH-O类型的,不能拆分。
可通过下面代码查看文件类型:
file TXLiteAVSDK_Professional_arm64.a
删除多余的架构
先cd进入TXLiteAVSDK_Professional.framework内
cd TXLiteAVSDK_Professional.framework/
查看TXLiteAVSDK_Professional支持的架构:
lipo -info TXLiteAVSDK_Professional
发现支持4种架构:
Architectures in the fat file: TXLiteAVSDK_Professional are: armv7 i386 x86_64 arm64
假设我们想删除i386架构,则执行命令
lipo -remove i386 TXLiteAVSDK_Professional -o TXLiteAVSDK_Professional
这样i386架构就被删除了。