今是昨非

今是昨非

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

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 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

image3

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

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
上記の ls コマンドで、両方のフォルダに Reachability.o ファイルがあることが確認できます。

分離された.o ファイルから競合する.o ファイルを削除します。すべてのフォルダで削除する必要がありますが、以下は一つの例です。#

image6

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

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

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

image8

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