Saya memiliki 2 pustaka Linux statis, dibuat oleh ar cr
, libabc.a
dan libxyz.a
.
Saya ingin menggabungkannya menjadi satu perpustakaan statis libaz.a
.
Bagaimana saya bisa melakukan ini.
Saya ingin membuat pustaka statis gabungan, bukan untuk memberikan kedua pustaka ke tautan terakhir aplikasi.
linux
static-libraries
ar
osgx
sumber
sumber
libtool
solusi berbasis :libtool -static -o new.a old1.a old2.a
Jawaban:
Anda dapat mengekstrak objek dari kedua
.a
file dan membuat.a
file Anda menggunakan.o
s:sumber
libabc.a
mungkin berisi objek yang memiliki nama yang sama (berasal dari direktori yang berbeda) - perakitan ulang tidak akan berfungsi!ar -c
tidak berhasil untuk saya (Ubuntu 14.04). Saya mengertiar: no operation specified
. Saya melakukannyaar -qc
dan itu berhasil dengan baik.Setidaknya ada tiga cara untuk melakukan ini secara native . Cara pertama dan paling portabel adalah menggunakan libtool. Setelah membangun pustaka lain juga dengan libtool, Anda dapat menggabungkannya hanya dengan menambahkan .la libs ke variabel libaz_la_LIBADD automake, atau langsung dari Makefile dengan sesuatu seperti:
Dua lainnya setidaknya tersedia saat menggunakan GNU ar. Anda dapat menggunakan skrip MRI (dinamai misalnya libaz.mri), seperti:
dan kemudian jalankan ar sebagai:
Atau Anda dapat menggunakan arsip tipis (opsi
-T
), yang akan memungkinkan penambahan arsip lain tanpa membuatnya bersarang di dalam, meskipun sisi negatifnya adalah jika Anda ingin mendistribusikan pustaka statis, objek yang terlepas akan hilang:Semua metode di atas dengan anggun menangani nama anggota yang tumpang tindih dari arsip asli.
Jika tidak, Anda harus membongkar ke dalam direktori yang berbeda dan mengemas ulang lagi, untuk menghindari penggantian nama anggota yang tumpang tindih:
sumber
ar cqT libaz.a libabc.a libxyz.a && echo -e 'create libaz.a\naddlib libaz.a\nsave\nend' | ar -M
. Ini membuat thin sementaralibaz.a
, dan kemudian mengubah arsip tipis menjadi arsip normal (sehingga Anda dapat memindahkan / mendistribusikannya). Ini juga menangani dengan baik ketika nama perpustakaan Anda memiliki karakter khusus (spasi, plus, atau koma) (yaituar cqT libbundle.a libfoo++.a 'libbar baz.a'
). Tapi +1 dari saya!libtool
saya mendapatkan kesalahan ini:libtool: link: unable to infer tagged configuration libtool: error: specify a tag with '--tag'
Ada ide bagaimana memperbaikinya?--Wl,-whole-archive
opsi diperlukan dalam perintah penautan asli untuk beberapa lib * .a, dan saya perlu menggabungkan semua lib * .a menjadione.a
. Saat menautkan lagi,--Wl,-whole-archive
tidak akan berfungsi denganone.a
. Apa saran anda stackoverflow.com/questions/56323197/…Jika Anda melakukannya sebagai:
Anda akan kehilangan beberapa file objek jika ada anggota dengan nama yang sama di aa dan ba jadi, Anda perlu mengekstrak anggota dari arsip yang berbeda ke folder yang berbeda:
Lebih jauh lagi, ada kemungkinan bahwa ada beberapa anggota dengan nama yang sama dalam satu arsip (katakanlah dalam aa), jika Anda menjalankan ar x aa , 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':
ini akan menjadi pekerjaan yang membosankan, jadi Anda harus menulis skrip yang lebih canggih untuk melakukan pekerjaan itu.
Salah satu solusi opsional adalah Anda dapat menggabungkan beberapa arsip menjadi satu perpustakaan bersama:
dengan cara ini linker akan menangani semua hal untuk Anda!
sumber
-fPIC
.Lebih baik lagi Anda melakukan penautan parsial pada setiap pustaka dan mereka membuat arsip dari dua file objek yang dihasilkan. Dengan cara itu ia beroperasi seperti perpustakaan bersama
Anda melakukan penautan parsial dengan
jadi alih-alih membuat arsip perantara atau setelah mengekstraksi ulang, jalankan
kemudian
sumber
sekarang Anda memiliki dua versi "macroblock-10.o"
sumber
Di sini, Anda membuat arsip arsip dan kemudian 'meratakan' (menipis) hasil dengan bendera T. Tidak yakin bagaimana itu akan bekerja dengan nama yang sama .o file yang mungkin ada di dalamnya.
sumber