iOS开发 两个静态库(.framework/.a)中.o文件冲突 duplicate symbols for architecture arm64

109 阅读2分钟

来源:www.liangzl.com/get-article…

duplicate symbol '_OBJC_CLASS_$_YYSYNTH_DUMMY_CLASS_NSData_YYAdd' in:

    /Users/gwl/Library/Developer/Xcode/DerivedData/hypnosisArtifact-crsyyabhrfowtnawtohwbaeyaeor/Build/Products/Debug-iphoneos/YYCategories/libYYCategories.a(NSData+YYAdd.o)

    /Users/gwl/hypnosis-artifact/hypnosisArtifact/hypnosisArtifact/QuadSDK.framework/QuadSDK(NSData+YYAdd.o)

duplicate symbol '_OBJC_METACLASS_$_YYSYNTH_DUMMY_CLASS_NSData_YYAdd' in:

    /Users/gwl/Library/Developer/Xcode/DerivedData/hypnosisArtifact-crsyyabhrfowtnawtohwbaeyaeor/Build/Products/Debug-iphoneos/YYCategories/libYYCategories.a(NSData+YYAdd.o)

    /Users/gwl/hypnosis-artifact/hypnosisArtifact/hypnosisArtifact/QuadSDK.framework/QuadSDK(NSData+YYAdd.o)

duplicate symbol '_OBJC_CLASS_$_YYSYNTH_DUMMY_CLASS_UIScreen_YYAdd' in:

    /Users/gwl/Library/Developer/Xcode/DerivedData/hypnosisArtifact-crsyyabhrfowtnawtohwbaeyaeor/Build/Products/Debug-iphoneos/YYCategories/libYYCategories.a(UIScreen+YYAdd.o)

    /Users/gwl/hypnosis-artifact/hypnosisArtifact/hypnosisArtifact/QuadSDK.framework/QuadSDK(UIScreen+YYAdd.o)

duplicate symbol '_OBJC_METACLASS_$_YYSYNTH_DUMMY_CLASS_UIScreen_YYAdd' in:

    /Users/gwl/Library/Developer/Xcode/DerivedData/hypnosisArtifact-crsyyabhrfowtnawtohwbaeyaeor/Build/Products/Debug-iphoneos/YYCategories/libYYCategories.a(UIScreen+YYAdd.o)

    /Users/gwl/hypnosis-artifact/hypnosisArtifact/hypnosisArtifact/QuadSDK.framework/QuadSDK(UIScreen+YYAdd.o)

duplicate symbol '_OBJC_CLASS_$_YYSYNTH_DUMMY_CLASS_UIDevice_YYAdd' in:

    /Users/gwl/Library/Developer/Xcode/DerivedData/hypnosisArtifact-crsyyabhrfowtnawtohwbaeyaeor/Build/Products/Debug-iphoneos/YYCategories/libYYCategories.a(UIDevice+YYAdd.o)

    /Users/gwl/hypnosis-artifact/hypnosisArtifact/hypnosisArtifact/QuadSDK.framework/QuadSDK(UIDevice+YYAdd.o)

duplicate symbol '_OBJC_METACLASS_$_YYSYNTH_DUMMY_CLASS_UIDevice_YYAdd' in:

    /Users/gwl/Library/Developer/Xcode/DerivedData/hypnosisArtifact-crsyyabhrfowtnawtohwbaeyaeor/Build/Products/Debug-iphoneos/YYCategories/libYYCategories.a(UIDevice+YYAdd.o)

    /Users/gwl/hypnosis-artifact/hypnosisArtifact/hypnosisArtifact/QuadSDK.framework/QuadSDK(UIDevice+YYAdd.o)

duplicate symbol '_OBJC_CLASS_$_YYSYNTH_DUMMY_CLASS_NSNumber_YYAdd' in:

    /Users/gwl/Library/Developer/Xcode/DerivedData/hypnosisArtifact-crsyyabhrfowtnawtohwbaeyaeor/Build/Products/Debug-iphoneos/YYCategories/libYYCategories.a(NSNumber+YYAdd.o)

    /Users/gwl/hypnosis-artifact/hypnosisArtifact/hypnosisArtifact/QuadSDK.framework/QuadSDK(NSNumber+YYAdd.o)

duplicate symbol '_OBJC_METACLASS_$_YYSYNTH_DUMMY_CLASS_NSNumber_YYAdd' in:

    /Users/gwl/Library/Developer/Xcode/DerivedData/hypnosisArtifact-crsyyabhrfowtnawtohwbaeyaeor/Build/Products/Debug-iphoneos/YYCategories/libYYCategories.a(NSNumber+YYAdd.o)

    /Users/gwl/hypnosis-artifact/hypnosisArtifact/hypnosisArtifact/QuadSDK.framework/QuadSDK(NSNumber+YYAdd.o)

duplicate symbol '_OBJC_CLASS_$_YYSYNTH_DUMMY_CLASS_NSArray_YYAdd' in:

    /Users/gwl/Library/Developer/Xcode/DerivedData/hypnosisArtifact-crsyyabhrfowtnawtohwbaeyaeor/Build/Products/Debug-iphoneos/YYCategories/libYYCategories.a(NSArray+YYAdd.o)

    /Users/gwl/hypnosis-artifact/hypnosisArtifact/hypnosisArtifact/QuadSDK.framework/QuadSDK(NSArray+YYAdd.o)

duplicate symbol '_OBJC_METACLASS_$_YYSYNTH_DUMMY_CLASS_NSArray_YYAdd' in:

    /Users/gwl/Library/Developer/Xcode/DerivedData/hypnosisArtifact-crsyyabhrfowtnawtohwbaeyaeor/Build/Products/Debug-iphoneos/YYCategories/libYYCategories.a(NSArray+YYAdd.o)

    /Users/gwl/hypnosis-artifact/hypnosisArtifact/hypnosisArtifact/QuadSDK.framework/QuadSDK(NSArray+YYAdd.o)

duplicate symbol '_OBJC_CLASS_$_YYSYNTH_DUMMY_CLASS_NSString_YYAdd' in:

    /Users/gwl/Library/Developer/Xcode/DerivedData/hypnosisArtifact-crsyyabhrfowtnawtohwbaeyaeor/Build/Products/Debug-iphoneos/YYCategories/libYYCategories.a(NSString+YYAdd.o)

    /Users/gwl/hypnosis-artifact/hypnosisArtifact/hypnosisArtifact/QuadSDK.framework/QuadSDK(NSString+YYAdd.o)

duplicate symbol '_OBJC_METACLASS_$_YYSYNTH_DUMMY_CLASS_NSString_YYAdd' in:

    /Users/gwl/Library/Developer/Xcode/DerivedData/hypnosisArtifact-crsyyabhrfowtnawtohwbaeyaeor/Build/Products/Debug-iphoneos/YYCategories/libYYCategories.a(NSString+YYAdd.o)

    /Users/gwl/hypnosis-artifact/hypnosisArtifact/hypnosisArtifact/QuadSDK.framework/QuadSDK(NSString+YYAdd.o)

ld: 12 duplicate symbols for architecture arm64

clang: error: linker command failed with exit code 1 (use -v to see invocation)

1.新建一个文件夹lib, 将QuadSDK.framework复制到lib文件夹内,QuadSDK.framework内容如图, QuadSDK就是我们要拆分的文件

2.打开终端, cd到QuadSDK.framework下, 执行

cd /Users/gwl/lib/QuadSDK.framework

2.查看包信息,如果提示fat file,那么代表这个包是支持多平台的,例如armv7,armv7s,i386等,需要我们逐一做解包重打包操作。否则我们只需要做相对应cpu架构解包重打包

lipo -info QuadSDK

3.从QuadSDK中拆分出arm64架构对应的.a库并命名为QuadSDK_arm64.a

lipo QuadSDK -thin arm64 -output QuadSDK_arm64.a

4.然后同样的方法修改架构名拆分出其他3种cpu架构对应的.a库, 拆分完如下图

lipo QuadSDK -thin armv7 -output QuadSDK_armv7.a

lipo QuadSDK -thin x86_64 -output QuadSDK_x86_64.a

拆分完如下图

5.将各个.a库拆分.o文件,每个架构的.a库都放到一个独立对应的.a文件夹中。在QuadSDK.framework根目录新建文件夹名为arm64, 将QuadSDK_arm64.a拖进该文件夹, 然后cd到arm64文件夹

 执行如下命令

ar -x QuadSDK_arm64.a

QuadSDK_arm64.a就被拆分成很多的.o文件,在里面找到造成冲突的.o文件删除掉。 

6.把拆分后的文件重新生成.framework静态库. 在arm64文件夹里执行如下命令

libtool -static -o ../QuadSDK_arm64.a *.o

合并后的 QuadSDK_arm64.a

7.把其他几个cpu架构的.a库重复第5、6步进行拆分合并

8.将所有cpu架构的.a库进行合并,把QuadSDK文件删除掉, 执行如下命令

cd /Users/gwl/lib/QuadSDK.framework
lipo -create -output QuadSDK QuadSDK_arm64.a QuadSDK_armv7.a QuadSDK_x86_64.a

9.最后恢复到开始时的结构,把多余的文件都删掉,把新的QuadSDK.framework放到项目中,再次运行