7

使いやすさのために iOS 静的フレームワークにパッケージ化したい大きな静的ライブラリがあります。ライブラリは、実際には複数の.aファイルであり、ライブラリの論理モジュールごとに 1 つです。

デバイス用(ファット ファイル、、、)とシミュレータ用(ファット ファイル、、)用に.aビルドされたコンパイル済みファイルがあります。armv7armv7sarm64i386x86_64

さて、私の知る限り、適切なフレームワークを構築するには、これらすべてのファイルを 1 つの大きなファイルに結合する必要があります。

ここで説明した手法 (静的ライブラリの結合) を使用すると、次のことができます。

libtool -static -o new.a old1.a old2.a

しかし、明らかに両方old1.aold2.a同じ記号が含まれています。したがって、フレームワークにリンクすると、(正当な理由で) リンカー エラーが発生しますduplicate symbols

それを行うためのより正しい方法 (したがって、シンボルの重複を回避する) は、ファイルを解凍し、.oそれらを大きな.aファイルに結合するようです (複数のライブラリ アーカイブ (.a) を 1 つのアーカイブ ファイルにパックする方法は? )

ar x old1.a
ar x old2.a
ar rcs new.a *.o

old1.aここで、とはファット ファイルであることを思い出してくださいold2.a。アーキテクチャごとに分離する必要があります。

だからここに私がすることがあります:

lipo old1.a -thin armv7 -output armv7/old1.a
cd armv7; ar x old1.a; cd ..
...
lipo old1.a -thin x86_64 -output x86_64/old1.a
cd x86_64; ar x old1.a; cd ..

// Same goes for old2.a ...

// Then, 
libtool -static -o new.a armv7/*.o armv7s/*.o arm64/*.o // ... etc

しかし、何らかの理由で、このように作成されたフレームワークに対してリンクすると、リンカーはシンボルを見つけることができません (nmそれらをすべて明らかにしたとしても)。

その静的フレームワークを構築する方法はありますか?

4

2 に答える 2

2

スタティック ライブラリ オブジェクトを 1 つに事前リンクできます。また、他のスタティック ライブラリを 1 つに事前リンクすることもできます。実際にはオブジェクトをリンカにリンクします(動的ライブラリとほぼ同じです)。

  1. 単一のライブラリ (メインのライブラリ) で [ビルド設定] に移動し、[リンク] セクションで [単一オブジェクトのプレリンクを実行] を見つけます。それをはいに切り替えます
  2. Prelink ライブラリでは、含めたい他のライブラリを指定できます。名前だけでなく、完全なファイル名を入力する必要があります。他のライブラリもプロジェクトにある場合は、 $(CONFIGURATION_BUILD_DIR) 変数を使用できます。したがって、ライブラリ foo がある場合、それは $(CONFIGURATION_BUILD_DIR)/libfoo.a になります。
  3. Single-Object Prelink Flags に追加のフラグを追加できます
  4. ローカル シンボルを取り除きたい場合は、デフォルトではスタティック ライブラリが取り除かれないように、Deployment Postprocessing が [はい] に設定されていることを確認してください。

ライブラリに重複するシンボルがある場合は、モジュールの構造に問題があります。

  • それらが同じ関数である場合は、それらを別の静的ライブラリに分離し、他の場所から再利用します。
  • これらのシンボルが実際には異なり、名前が同じである場合は、それらを静的として宣言することを検討してください (ANSI C の場合)。あなたもすることができます
  • 可視性を設定することで、いくつかのローカルシンボルを隠すことができます ( http://llvm.org/docs/LangRef.html#visibility-styleshttp://gcc.gnu.org/wiki/Visibility )
于 2014-02-06T12:17:17.020 に答える