ar cr
、libabc.a
、およびlibxyz.a
によって作成された2つの静的Linuxライブラリがあります。
それらを1つの静的ライブラリlibaz.a
にマージします。
これどうやってするの。
両方のライブラリをアプリケーションの最終的なリンクにしないために、マージされた静的ライブラリを作成します。
.a
ファイルの両方からオブジェクトを抽出し、抽出された.a
sを使用して.o
ファイルを作成できます。
ar -x libabc.a
ar -x libxyz.a
ar -c libaz.a *.o
これを行うには、少なくとも3つの方法があります自然に。最初の最も移植性の高い方法は、libtoolを使用することです。 libtoolで他のライブラリもビルドした後、.la libsをautomake libaz_la_LIBADD変数に追加するか、Makefileから直接次のようなものを追加するだけで、それらを結合できます。
libtool --mode=link cc -static -o libaz.la libabc.la libxyz.la
他の2つは、少なくともGNU ar。を使用する場合に使用可能です。たとえば、libaz.mriという名前のMRI)スクリプトを使用できます。
create libaz.a
addlib libabc.a
addlib libxyz.a
save
end
そして、arを次のように実行します:
ar -M <libaz.mri
または、thin archive(option -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.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
さらに、1つのアーカイブ(a.aなど)に同じ名前の複数のメンバーが存在する可能性があります。ar x 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
このようにして、リンカがすべてを処理します!
さらに、各ライブラリで部分リンクを実行すると、結果の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
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つのバージョンを持っています