Saya memiliki sepotong kecil kode yang tergantung pada banyak perpustakaan statis (a_1-a_n). Saya ingin mengemas kode itu di perpustakaan statis dan membuatnya tersedia untuk orang lain.
Pustaka statis saya, sebut saja X, kompilasi dengan baik.
Saya telah membuat contoh program sederhana yang menggunakan fungsi dari X, tetapi ketika saya mencoba menautkannya ke X, saya mendapatkan banyak kesalahan tentang simbol yang hilang dari pustaka a_1 - a_n.
Apakah ada cara saya bisa membuat perpustakaan statis baru, Y yang berisi X dan semua fungsionalitas yang diperlukan oleh X (bit yang dipilih dari a_1 - a_n), sehingga saya bisa mendistribusikan Y hanya untuk orang-orang untuk menautkan program mereka?
MEMPERBARUI:
Saya telah melihat hanya membuang semuanya dengan ar dan membuat satu mega-lib, namun, yang akhirnya termasuk banyak simbol yang tidak diperlukan (semua file .o sekitar 700 MB, namun, executable yang terhubung secara statis adalah 7 MB). Apakah ada cara yang baik untuk memasukkan hanya apa yang sebenarnya dibutuhkan?
Ini terlihat terkait erat dengan Bagaimana menggabungkan beberapa perpustakaan C / C ++ menjadi satu? .
-r
bahwa output dapat digunakan sebagai input untuk ld. Jika Anda menautkan sekali Anda harus mendapatkan relokasi, itu bisa menjadi pengganti perpustakaan Anda. (Sudah mencobanya thogh).Jika Anda menggunakan Visual Studio maka ya, Anda bisa melakukan ini.
Alat pembuat perpustakaan yang dilengkapi dengan Visual Studio memungkinkan Anda untuk bergabung dengan perpustakaan bersama di baris perintah. Saya tidak tahu cara untuk melakukan ini di editor visual.
sumber
Di Linux atau MingW, dengan GNU toolchain:
Jika Anda tidak menghapus
liba.a
danlibb.a
, Anda dapat membuat "arsip tipis":Di Windows, dengan MSVC toolchain:
sumber
ar crsT
, yang melakukan sesuatu seperti "symlinking" daripada menyalin, maka Anda hanya perlu mengirimkan satu salinan data.Pustaka statis hanyalah arsip dari
.o
file objek. Ekstrak mereka denganar
( dengan asumsi Unix) dan kemas kembali ke satu perpustakaan besar.sumber
Atau ke
Link Library Dependencies
dalam properti proyek ada cara lain untuk menautkan pustaka di Visual Studio.Add Existing Item...
).Item Type
adalahLibrary
Ini akan termasuk perpustakaan lain di X seolah-olah Anda berlari
sumber
Catatan sebelum Anda membaca sisanya: Script shell yang ditampilkan di sini tentu tidak aman untuk digunakan dan diuji dengan baik. Gunakan dengan risiko Anda sendiri!
Saya menulis skrip bash untuk menyelesaikan tugas itu. Misalkan perpustakaan Anda adalah lib1 dan yang Anda perlu menyertakan beberapa simbol dari adalah lib2. Script sekarang berjalan dalam satu loop, di mana ia pertama kali memeriksa simbol yang tidak terdefinisi dari lib1 dapat ditemukan di lib2. Ini kemudian mengekstrak file objek yang sesuai dari lib2 dengan
ar
, mengubah nama mereka sedikit, dan menempatkannya ke lib1. Sekarang mungkin ada lebih banyak simbol yang hilang, karena hal-hal yang Anda sertakan dari lib2 membutuhkan hal-hal lain dari lib2, yang belum kami sertakan, sehingga loop perlu dijalankan kembali. Jika setelah melewati beberapa loop tidak ada perubahan lagi, yaitu tidak ada file objek dari lib2 ditambahkan ke lib1, loop dapat berhenti.Perhatikan, bahwa simbol yang disertakan masih dilaporkan sebagai tidak terdefinisi oleh
nm
, jadi saya melacak file objek, yang ditambahkan ke lib1, sendiri, untuk menentukan apakah loop dapat dihentikan.Saya menamai skrip itu
libcomp
, sehingga Anda dapat memanggilnya misalnya dengandari mana libwhever adalah tempat Anda ingin menyertakan simbol. Namun, saya pikir paling aman untuk menyalin semuanya ke direktori yang terpisah terlebih dahulu. Saya tidak akan terlalu mempercayai skrip saya (namun, itu berhasil untuk saya; Saya bisa memasukkan libgsl.a ke dalam perpustakaan numerik saya dengan itu dan meninggalkan saklar kompiler -lgsl).
sumber