Setidaknya ada tiga cara untuk melakukannya secara asli . Cara pertama dan paling portabel adalah menggunakan libtool. Setelah membangun perpustakaan lain juga dengan libtool, Anda dapat menggabungkannya hanya dengan menambahkan .la lib ke variabel automake libaz_la_LIBADD, atau langsung dari Makefile dengan sesuatu seperti:
libtool --mode=link cc -static -o libaz.la libabc.la libxyz.la
Dua lainnya setidaknya tersedia saat menggunakan GNU ar. Anda dapat menggunakan skrip MRI (bernama misalnya libaz.mri), seperti:
create libaz.a
addlib libabc.a
addlib libxyz.a
save
end
dan kemudian jalankan ar sebagai:
ar -M <libaz.mri
Atau Anda bisa menggunakan tipis arsip (opsi -T
), yang akan memungkinkan penambahan arsip lain tanpa membuatnya bersarang di dalamnya, meskipun kekurangannya adalah jika Anda ingin mendistribusikan pustaka statis, objek yang terlepas akan hilang:
ar -rcT libaz.a libabc.a libxyz.a
Semua metode di atas dengan baik menangani nama anggota yang tumpang tindih dari arsip asli.
Jika tidak, Anda harus membongkar ke direktori yang berbeda dan mengemas ulang lagi, untuk menghindari penggantian nama anggota yang tumpang tindih:
mkdir abc; cd abc; ar -x ../libabc.a
mkdir xyz; cd xyz; ar -x ../libxyz.a
ar -qc libaz.a abc xyz
Jika Anda hanya melakukannya sebagai :
ar x a.a
ar x b.a
ar c c.a *.o
Anda akan kehilangan beberapa file objek jika ada anggota dengan nama yang sama di a.a dan b.aso, Anda perlu mengekstrak anggota dari arsip yang berbeda ke folder yang berbeda:
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
lebih jauh lagi, mungkin ada banyak anggota dengan nama yang sama dalam satu arsip (katakanlah dalam a.a), jika Anda menjalankan ar x a.a , Anda hanya akan mendapatkan satu untuk anggota dengan nama yang sama.
Satu-satunya cara untuk mengekstrak semua anggota dengan nama yang sama dalam satu arsip adalah dengan menentukan nomor anggota dengan opsi '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
...
ini akan menjadi pekerjaan yang membosankan, jadi Anda harus menulis skrip yang lebih canggih untuk melakukan pekerjaan itu.
Satu opsional solusinya adalah Anda dapat menggabungkan beberapa arsip menjadi satu pustaka bersama:
g++ -shared -o c.so -Wl,--whole-archive a.a b.a
dengan cara ini penaut akan menangani semua hal untuk Anda!
Anda dapat mengekstrak objek dari .a
file dan buat .a
Anda file menggunakan .o
yang diekstraksi s:
ar -x libabc.a
ar -x libxyz.a
ar -c libaz.a *.o
Bahkan lebih baik Anda melakukan penautan parsial pada setiap pustaka dan mereka membuat arsip dari dua file objek yang dihasilkan. Dengan begitu ia beroperasi seperti perpustakaan bersama
Anda melakukan penautan sebagian dengan
gcc -r --nostdlib
jadi alih-alih membuat arsip perantara atau setelah mengekstraknya kembali, jalankan
gcc -r --nostdlib $CFLAGS $OBJECTS_A -o $LIBNAME_A.o
gcc -r --nostdlib $CFLAGS $OBJECTS_B -o $LIBNAME_B.o
lalu
ar -cr $LIBNAME_JOINED.a $LIBNAME_A.o $LIBNAME_B.o