109

と によって作成された 2 つの静的 Linux ライブラリがar crありlibabc.aますlibxyz.a
それらを 1 つの静的ライブラリにマージしたいlibaz.a
これどうやってするの。

両方のライブラリをアプリケーションの最終リンクに提供するのではなく、マージされた静的ライブラリを作成したい。

4

8 に答える 8

141

これをネイティブに行うには、少なくとも 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

または、シンアーカイブ (オプション-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
于 2014-05-13T02:09:04.457 に答える
66

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

ar -x libabc.a
ar -x libxyz.a
ar -c libaz.a  *.o
于 2010-09-29T13:17:01.077 に答える
10

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

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

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

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

さらに、1 つのアーカイブ (aa など) に同じ名前の複数のメンバーが存在する可能性があります。ar x aaを実行すると、同じ名前のメンバーに対して 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 

このようにして、リンカーがすべてを処理します。

于 2014-05-09T06:25:45.713 に答える