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 ファイル:この 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 ファイルである場合、さらに分離する必要があります。Non-fat ファイルのみが.o を分離できます。したがって、まだ
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
ここで、最初のエラーを再確認します。
Reachability.o の問題が見えます。上記の ls コマンドを使用すると、確かに 2 つのフォルダにこの.o ファイルが存在することがわかります。
分離された.o から衝突する.o を削除します。すべてのフォルダから削除する必要があります。以下は 1 つだけを示しています。#
残りの.o ファイルを lib (.o) に統合します。フォルダの場所に注意してください。#
admin-imac:arm64 admin$ libtool -static -o ../libarm64.a *.o
最終的に 2 つの libarm64.a と libarmv7.a が生成され、衝突ファイルを削除した後の新しい.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