どのように混ざり合"ar"静的ライブラリ。
-
26-09-2019 - |
質問
私は2静Linux図書館作成 ar cr
, libabc.a
や libxyz.a
.
たいへ統合して一つの静的ライブラリ libaz.a
.
する方法を教えてください。
作りたいと合併静的ライブラリであり、両方の図書館の最終的なリンク願います。
解決
あなたは.a
ファイルの両方からオブジェクトを抽出し、抽出された.a
sを使用して.o
ファイルを作成することができます:
ar -x libabc.a
ar -x libxyz.a
ar -c libaz.a *.o
他のヒント
のネイティブのこれを行うには、少なくとも3つの方法があります。最初の、そして最もポータブルな方法は、libtoolを使用することです。
:libtoolをしても、他のライブラリを構築した後、あなたのようなもので、単にautomakeにlibaz_la_LIBADD変数に.laのLIBSを追加することにより、または直接のMakefileからそれらを組み合わせることができますlibtool --mode=link cc -static -o libaz.la libabc.la libxyz.la
GNU ARを使用する場合他の2つは、少なくとも利用可能です。
:あなたのような、(例えばlibaz.mriにちなんで命名)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
だけならいど:
ar x a.a
ar x b.a
ar c c.a *.o
またされているにも関わらオブジェクトファイルがある場合員と同じ名前の両方。aとb.a なので、必要なものを抽出員の異なるアーカイブから別のフォルダ:
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
さらに、変換できない文字が含まれていposibleが複数の会員の同じ名前の一つのアーカイブ(言いました。a)、走らせる場合 ar x。a, まだの方は会員のです。
のみを抽出する方法を全員に同じ名前の一つのアーカイブは指定の会員番号によるオプション'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
...
その一環として行われた気の遠くなるような仕事で使って書くより高度化スクリプトな仕事です。
一つ オプション ソリューションズとを組み合わせることができ複数のアーカイブを一つの共有ライブラリ:
g++ -shared -o c.so -Wl,--whole-archive a.a b.a
そうすることによって、リンカーの取り扱います。
さらに良いことに、あなたは、各ライブラリの部分リンクを実行し、それらが得られた二つのオブジェクトファイルのアーカイブを作ります。そうすれば、それは共有ライブラリと同様に動作するでしょう。
あなたがして部分リンクを実行します。
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
ar -x libx264.a
mkdir sub && cd sub
ar -m ../libx264.a `ar -t ../libx264.a |sort|uniq|grep "\.o"`
ar -x ../libx264.a
今、あなたは、「マクロブロック・10.o」の2つのバージョンがあります。