GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara menggabungkan dua perpustakaan statis menjadi satu?

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

Linux
  1. Bagaimana menangani perpustakaan dinamis dan statis di Linux

  2. [Lanjutan] Cara Mengelompokkan Dua Akun Terpisah menjadi Satu Akun dengan Addon Domain

  3. Bagaimana Mengkonversi Video Kualitas Tinggi Menjadi Kualitas Rendah?

  1. Cara menggabungkan 2 grup volume (VG) menjadi satu menggunakan vgmerge di LVM

  2. Bagaimana cara menggabungkan dua file menggunakan AWK?

  3. Bagaimana cara membagi satu file teks menjadi beberapa file *.txt?

  1. Apakah Mungkin Menginstal Dua Layanan Untuk Satu Paket Menggunakan Dh_installinit? Bagaimana?

  2. Menggabungkan dua file HTML menjadi file master HTML

  3. Bagaimana cara gzip banyak file menjadi satu file gz?