lib (a) による duplicate-symbol の問題#
リンク:
説明#
まず、このタイプのエラーであることを確認する必要があります
それから始めて、最初のリンクに従って修正するか、以下を参照することができます
サードパーティの lib (.a) ライブラリをインポートする際、既存のプロジェクトと同じオープンソースコードがサードパーティの lib ライブラリに含まれているため、.o の競合が発生することがよくあります。
lib ライブラリがサポートするフレームワークのタイプを順番に確認します。#
i386:シミュレーター;
armv7:iphone4;
armv7s:iphone5,iphone5s;
arm64:iphone6,iphone6p。
-
まず、競合している.a ファイルを別のフォルダにコピーし、そのフォルダに移動するコマンドを使用します
-
lib ライブラリがサポートするフレームワークのタイプを確認します。以下の lib.a または libRyFitLibrary.a は私の間違った.a ファイルです
admin-imac:testlib admin$ lipo -info lib.a 2 Architectures in the fat file: lib.a are: armv7
armv7s arm64 3 admin-imac:testlib admin$
fat file:この lib ライブラリファイルには、複数のフレームワークの lib ライブラリが統合されていることを示します。ここでは、armv7 と arm64 が統合されています。もしシミュレーターの lib ライブラリも統合されている場合、ここに i386 のマークも表示されます。
armv7 タイプの.a ライブラリを分離します#
admin-imac:testlib admin$ lipo -extract_family armv7 -output lib_armv7.a lib.a
admin-imac:testlib admin$ lipo -info lib_armv7.a 3 Architectures in the fat file: lib_armv7.a are: armv7 armv7s
もし分離された lib_armv7.a がまだ fat ファイルである場合、さらに分離する必要があります。.o を分離するには、Non-fat ファイルである必要があります。
arm64 タイプの.a ライブラリを分離します#
arm64 は iOS システムで最も新しいフレームワークですが、armv7、armv7s の分離方法では arm64 バージョンの Non-fat ファイルを分離することはできません。何度か試行錯誤した結果、以下のコマンドで直接分離できることがわかりました。
admin-imac:testlib admin$ lipo lib.a -thin arm64 -output lib_final_arm64.a
admin-imac:testlib admin$ lipo -info lib_final_arm64.a
input file lib_final_arm64.a is not a fat file
Non-fat file: lib_final_arm64.a is architecture: arm64
ターゲットファイル.o を分離します#
上記の手順で armv7、arm64 フレームワークの lib ライブラリを一つずつ分離できるようになったので、それぞれのフレームワークに対して、.a ライブラリから分離された.o ファイルを保存するためのフォルダを作成します。他のものも同様です。
以下は armv7 の例です:
admin-imac:testlib admin$ mkdir armv72
admin-imac:testlib admin$ cd armv73
admin-imac:armv7 admin$ ar -x ../lib_final_armv7.a
ここで、最初のエラーをもう一度見てみましょう。
上記の ls コマンドで、両方のフォルダに Reachability.o ファイルがあることが確認できます。
分離された.o ファイルから競合する.o ファイルを削除します。すべてのフォルダで削除する必要がありますが、以下は一つの例です。#
残りの.o ファイルを結合して lib (.o) にします。所在するフォルダに注意してください#
admin-imac:arm64 admin$ libtool -static -o ../libarm64.a *.o
最終的に、libarm64.a と libarmv7.a という 2 つのファイルが追加されたことがわかります。これらは競合するファイルを削除して生成された.a ファイルです。
最終的な共通静的ライブラリを結合します#
admin-imac:testlib admin$ lipo -create -output libs.a libarmv7.a libarmv7s.a libarm64.a
admin-imac:testlib admin$ lipo -info libs.a
Architectures in the fat file: libs.a are: armv7 armv7s arm64