今是昨非

今是昨非

日出江花红胜火,春来江水绿如蓝

lib(a)によるduplicate-symbolの問題

lib (a) による duplicate-symbol の問題#

リンク:

  1. iOS lib (.a) ライブラリの衝突解決方法
  2. iOS 2 つの静的ライブラリに同名ファイルの衝突解決策

説明#

まず、このタイプのエラーであることを確認してください。
image1

次に、最初のリンクに従って修正を行うこともできますし、以下を参照することもできます。

サードパーティの lib (.a) ライブラリを導入する際、サードパーティの lib ライブラリが既存のプロジェクトと同じオープンソースコードを含んでいるために、.o の衝突が発生することがよくあります。

lib ライブラリがサポートするフレームワークのタイプを順に確認します。#

i386:シミュレーター;
armv7:iphone4;
armv7s:iphone5,iphone5s;
arm64:iphone6,iphone6p。

  1. まず、衝突している.a ファイルを単独でフォルダにコピーし、コマンドラインでそのフォルダに移動します。
    image1

  2. 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$

image2

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

image3

もし分離された 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

image4

目標ファイル.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

image5

ここで、最初のエラーを再確認します。
image1
Reachability.o の問題が見えます。上記の ls コマンドを使用すると、確かに 2 つのフォルダにこの.o ファイルが存在することがわかります。

分離された.o から衝突する.o を削除します。すべてのフォルダから削除する必要があります。以下は 1 つだけを示しています。#

image6

残りの.o ファイルを lib (.o) に統合します。フォルダの場所に注意してください。#

admin-imac:arm64 admin$ libtool -static -o ../libarm64.a *.o

image7
最終的に 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

image8

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。