Saya telah terlibat dalam beberapa perdebatan sehubungan dengan perpustakaan di Linux, dan ingin mengkonfirmasi beberapa hal.
Ini untuk pemahaman saya (tolong perbaiki saya jika saya salah dan saya akan mengedit posting saya nanti), bahwa ada dua cara menggunakan perpustakaan ketika membangun aplikasi:
- Pustaka statis (file .a): Pada waktu tautan, salinan seluruh pustaka dimasukkan ke dalam aplikasi akhir sehingga fungsi-fungsi di dalam pustaka selalu tersedia untuk aplikasi panggilan.
- Objek bersama (file .so): Pada waktu tautan, objek baru diverifikasi terhadap API-nya melalui file header (.h) yang sesuai. Perpustakaan tidak benar-benar digunakan sampai runtime, di mana dibutuhkan.
Keuntungan yang jelas dari perpustakaan statis adalah bahwa mereka memungkinkan seluruh aplikasi untuk mandiri, sedangkan manfaat perpustakaan dinamis adalah bahwa file ".so" dapat diganti (yaitu: jika perlu diperbarui karena keamanan bug) tanpa memerlukan aplikasi dasar untuk dikompilasi ulang.
Saya telah mendengar beberapa orang membedakan antara objek yang dibagikan dan pustaka tautan dinamis (DLL), meskipun keduanya adalah file ".so". Apakah ada perbedaan antara objek yang dibagikan dan DLL ketika datang ke pengembangan C / C ++ di Linux atau OS yang memenuhi POSIX lainnya (yaitu: MINIX, UNIX, QNX, dll)? Saya diberitahu bahwa satu perbedaan utama (sejauh ini) adalah bahwa objek yang dibagikan hanya digunakan saat runtime, sedangkan DLL harus dibuka terlebih dahulu menggunakan panggilan dlopen () dalam aplikasi.
Akhirnya, saya juga mendengar beberapa pengembang menyebutkan "shared arsip", yang, menurut pemahaman saya, juga merupakan perpustakaan statis sendiri, tetapi tidak pernah digunakan oleh aplikasi secara langsung. Sebagai gantinya, pustaka statis lain akan terhubung dengan "arsip bersama" untuk menarik beberapa (tapi tidak semua) fungsi / sumber daya dari arsip bersama ke pustaka statis yang sedang dibangun.
Terima kasih sebelumnya atas bantuan Anda.
Memperbarui
Dalam konteks di mana istilah-istilah ini diberikan kepada saya, itu istilah yang keliru secara efektif digunakan oleh tim pengembang Windows yang harus belajar Linux. Saya mencoba untuk memperbaikinya, tetapi norma-norma bahasa (salah) macet.
- Shared Object: Pustaka yang secara otomatis ditautkan ke program ketika program dimulai, dan ada sebagai file mandiri. Perpustakaan termasuk dalam daftar penautan pada waktu kompilasi (yaitu:
LDOPTS+=-lmylib
untuk file perpustakaan bernamamylib.so
). Perpustakaan harus ada pada waktu kompilasi, dan ketika aplikasi dimulai. - Static Library: Suatu perpustakaan yang digabung ke dalam program aktual itu sendiri pada waktu membangun untuk satu aplikasi (lebih besar) yang berisi kode aplikasi dan kode perpustakaan yang secara otomatis ditautkan ke dalam suatu program ketika program dibangun, dan biner akhir berisi keduanya program utama dan perpustakaan itu sendiri ada sebagai file biner tunggal yang berdiri sendiri. Perpustakaan termasuk dalam daftar penautan pada waktu kompilasi (yaitu:
LDOPTS+=-lmylib
untuk file perpustakaan bernama mylib.a). Perpustakaan harus ada pada waktu kompilasi. - DLL: Pada dasarnya sama dengan objek bersama, tetapi bukannya dimasukkan dalam daftar tautan pada waktu kompilasi, pustaka dimuat melalui
dlopen()
/dlsym()
perintah sehingga pustaka tidak perlu ada pada saat membangun untuk mengkompilasi program. Juga, perpustakaan tidak perlu hadir (harus) pada startup aplikasi atau waktu kompilasi , karena hanya diperlukan pada saatdlopen
/dlsym
panggilan dibuat. - Shared Archive: Pada dasarnya sama dengan perpustakaan statis, tetapi dikompilasi dengan flag "export-shared" dan "-fPIC". Perpustakaan termasuk dalam daftar penautan pada waktu kompilasi (yaitu:
LDOPTS+=-lmylibS
untuk file perpustakaan bernamamylibS.a
). Perbedaan antara keduanya adalah bahwa bendera tambahan ini diperlukan jika objek bersama atau DLL ingin secara statis menghubungkan arsip bersama ke dalam kode sendiri DAN dapat membuat fungsi dalam objek bersama tersedia untuk program lain, daripada hanya menggunakannya internal ke DLL. Ini berguna jika seseorang menyediakan Anda dengan perpustakaan statis, dan Anda ingin mengemasnya kembali sebagai SO. Perpustakaan harus ada pada waktu kompilasi.
Pembaruan Tambahan
Perbedaan antara " DLL
" dan " shared library
" hanyalah sebuah percakapan sehari-hari (malas, tidak akurat) di perusahaan tempat saya bekerja (pengembang Windows dipaksa untuk beralih ke pengembangan Linux, dan istilah itu macet), mengikuti deskripsi yang disebutkan di atas.
Selain itu, " S
" literal yang mengikuti nama perpustakaan, dalam kasus "arsip bersama" hanyalah sebuah konvensi yang digunakan di perusahaan itu, dan tidak di industri secara umum.
.a
file, "a" sebenarnya singkatan dari "archove", dan itu hanyalah arsip dari file objek. Linker modern harus cukup baik untuk tidak perlu menyertakan perpustakaan sementara, hanya file objek dalam arsip yang diperlukan, dan bahkan mungkin hanya menggunakan bagian kode / data dalam file objek yang direferensikan.