GNU/Linux >> Linux の 問題 >  >> Linux

2 つの ar 静的ライブラリを 1 つにマージする方法は?

これをネイティブで行うには、少なくとも 3 つの方法があります。 .最初の最も移植性の高い方法は、libtool を使用することです。他のライブラリも libtool でビルドした後、.la ライブラリを automake の libaz_la_LIBADD 変数に追加するか、次のような Makefile から直接追加するだけで、それらを組み合わせることができます:

libtool --mode=link cc -static -o libaz.la libabc.la libxyz.la

他の 2 つは、GNU ar を使用する場合に少なくとも使用できます。次のような MRI スクリプト (libaz.mri などの名前) を使用できます。

create libaz.a
addlib libabc.a
addlib libxyz.a
save
end

次にarを次のように実行します:

ar -M <libaz.mri

または、thin を使用できます アーカイブ (オプション -T )、これにより、他のアーカイブを内部にネストせずに追加できますが、静的ライブラリを配布する場合、切り離されたオブジェクトが失われるという欠点があります:

ar -rcT libaz.a libabc.a libxyz.a

上記のすべてのメソッドは、元のアーカイブから重複するメンバー名を適切に処理します。

そうしないと、重複するメンバー名の置換を避けるために、別のディレクトリに解凍して再度再パックする必要があります:

mkdir abc; cd abc; ar -x ../libabc.a
mkdir xyz; cd xyz; ar -x ../libxyz.a
ar -qc libaz.a abc xyz

単純に次のようにすると:

ar x a.a
ar x b.a
ar c c.a  *.o 

a.a と b.aso の両方に同じ名前のメンバーがある場合、いくつかのオブジェクト ファイルが失われます。別のアーカイブのメンバーを別のフォルダーに抽出する必要があります。

ar x a.a && mv *.o a_objs
ar x b.a && mv *.o b_objs
ar c c.a a_objs/*.o b_objs/*.o

さらに、ar x a.a を実行すると、1 つのアーカイブ (a.a など) に同じ名前の複数のメンバーが存在する可能性があります。 、同じ名前のメンバーに対して 1 つだけ取得します。

1 つのアーカイブで同じ名前のすべてのメンバーを抽出する唯一の方法は、オプション 'N' でメンバー番号を指定することです:

ar xN 1 a.a  xxx.c.o && mv xxx.c.o xxx.c.1.o
ar xN 2 b.a  xxx.c.o && mv xxx.c.o xxx.c.2.o
...

これは退屈な作業になるため、その作業を行うには、より洗練されたスクリプトを作成する必要があります。

1 つのオプション 解決策は、複数のアーカイブを 1 つの共有ライブラリに結合できることです:

g++ -shared -o c.so -Wl,--whole-archive a.a b.a 

このようにすれば、リンカーがすべてを処理してくれます!


.a の両方からオブジェクトを抽出できます ファイルを作成して .a を作成します 抽出された .o を使用するファイル s:

ar -x libabc.a
ar -x libxyz.a
ar -c libaz.a  *.o

さらに良いのは、各ライブラリで部分リンクを実行し、結果として得られる 2 つのオブジェクト ファイルのアーカイブを作成することです。そうすれば、共有ライブラリと同じように動作します

で部分リンクを行います
gcc -r --nostdlib

したがって、中間アーカイブを作成する代わりに、またはそれを再解凍した後に実行してください

gcc -r --nostdlib $CFLAGS $OBJECTS_A -o $LIBNAME_A.o
gcc -r --nostdlib $CFLAGS $OBJECTS_B -o $LIBNAME_B.o

それから

ar -cr $LIBNAME_JOINED.a $LIBNAME_A.o $LIBNAME_B.o

Linux
  1. LVM で vgmerge を使用して 2 つのボリューム グループ (VG) を 1 つにマージする方法

  2. 1 つのテキスト ファイルを複数の *.txt ファイルに分割する方法は?

  3. 2 つの HTML ファイルをマスター HTML ファイルにマージする

  1. Linuxで動的ライブラリと静的ライブラリを処理する方法

  2. [詳細]アドオンドメインを使用して2つの別々のアカウントを1つのアカウントにグループ化する方法

  3. 複数のファイルを1つのgzファイルにgzipする方法は?

  1. Dh_installinitを使用して1つのパッケージに2つのサービスをインストールすることは可能ですか?どのように?

  2. 複数のインターネット接続を1つにマージする方法は?

  3. 複数の PDF ファイルを 1 つの PDF に結合/変換する