Ada 2 argumen untuk memiliki pustaka bersama:
- Ini membantu mengurangi ruang disk.
- Ketika pustaka bersama diperbarui, semua binari yang bergantung padanya mendapatkan pembaruan.
Terutama ada satu kelemahan untuk perpustakaan bersama:
- Mereka (dapat) memperkenalkan neraka ketergantungan.
Pada komputer desktop, keuntungan pertama tidak lagi berlaku. Membuang-buang ruang disk tidak banyak masalah hari ini.
Memiliki binari statis akan memungkinkan kita untuk mendapatkan manajer paket yang jauh lebih baik - maksud saya, neraka ketergantungan akan menjadi hal di masa lalu. Menambahkan program akan hanya menambahkan biner; akhirnya folder untuk membiarkannya menangani file-nya. Menghapus program hanya akan menghapus file ini. Ketergantungan? Hilang.
Keuntungan ke-2 masih ada, tapi saya pikir keuntungan binari statis pada komputer desktop lebih berat daripada itu. Maksudku, bahkan bahasa-bahasa baru seperti Go mengkompilasi semua binari mereka terlepas dari keuntungan shared library, karena kenyamanannya.
Karena salah satu kelebihan utama dari shared library bukanlah masalah besar lagi, apakah C static library masih disukai? Jika demikian, mengapa?
Jawaban:
Premis pertanyaan Anda cacat. Apa yang disukai adalah menempel doktriner dan absolut tanpa pemahaman tentang dasar di belakang mereka (Pemrograman Kargo Cargo?).
Jawaban SO tertaut adalah studi yang menarik dalam topik yang sangat- Pertanyaan itu adalah tentang mengapa kompilasi dengan opsi-statis tidak bekerja, jawaban yang Anda tautkan tidak lebih dari kata-kata kasar tentang tidak menggunakan tautan statis. Jika tidak membahas mengapa itu buruk, dan menuntut OP menggunakan tautan dinamis. Sangat disayangkan itu ditandai sebagai jawaban yang benar (jawaban berikut memiliki dua kali lebih banyak suara dan merupakan jawaban yang benar untuk pertanyaan OP) karena meskipun jawaban yang benar ada, itu sangat tersembunyi di antara pendapat dogmatis.
Pertanyaan sebenarnya adalah apa pro dan kontra dari menghubungkan statis vs dinamis dan kapan satu lebih disukai dari yang lain.
sumber
Dari sudut pandang pengembang, penautan dinamis sering kali dapat mempercepat kompilasi / tautan / pengujian Anda.
Dari sudut pandang manajemen paket, ambil libGL, misalnya. Saya memiliki sekitar selusin implementasi berbeda yang tersedia di manajer paket saya, beberapa generik dan beberapa menargetkan kartu grafis tertentu. Jika tidak terhubung secara dinamis, harus ada selusin versi dari setiap program yang terhubung dengan libGL, atau Anda harus menyusun lapisan abstraksi tambahan yang tidak seefisien panggilan fungsi.
Pikirkan masalah keamanan di perpustakaan populer seperti Qt. Dengan tautan dinamis, saya hanya dapat memperbarui satu paket itu, daripada harus mengidentifikasi, mengkompilasi ulang, dan menggunakan setiap paket tunggal yang terhubung di Qt.
Menghubungkan statis mungkin memiliki keuntungan dalam aplikasi sumber tertutup yang dikerahkan secara independen, tetapi dalam manajemen paket sumber terbuka itu lebih menyakitkan daripada membantu.
sumber
Pustaka bersama sangat disukai oleh pengelola distribusi Linux karena alasan Anda # 2. Sangat penting bagi mereka bahwa, misalnya, ketika seseorang menemukan bug keamanan di zlib , mereka tidak harus mengkompilasi ulang setiap program yang menggunakan zlib --- tidak hanya biayanya lebih banyak siklus CPU untuk melakukan mengkompilasi ulang, semua orang yang menggunakan distro kemudian harus mengunduh ulang semua program tersebut. Sementara itu, dalam paket yang disediakan oleh distribusi, neraka ketergantungan bukanlah suatu masalah, karena semuanya diuji untuk bekerja dengan set perpustakaan itu.
Jika Anda sedang membangun perangkat lunak pihak ketiga bahwa kebutuhan perpustakaan yang tidak dalam distribusi Anda, maka statis menghubungkan orang-orang perpustakaan mungkin kurang kerumitan daripada alternatif, dan yang baik itu.
Hal penting lainnya yang perlu diketahui adalah bahwa GNU
libc
dan GCClibstdc++
memiliki komponen yang tidak berfungsi dengan baik jika pustaka terhubung secara statis. Masalah yang paling umum adalah dengandlopen
, karena modul apa pun yang Anda muat dengandlopen
itu sendiri terkait secara dinamislibc.so.6
. Jadi itu berarti sekarang Anda memiliki dua salinan pustaka C di ruang alamat Anda, dan keriuhan terjadi ketika mereka tidak menyetujui salinanmalloc
struktur data internal mana (misalnya) yang resmi. Semakin buruk: sejumlah fungsi yang tampaknya tidak ada hubungannya dengandlopen
, sukagethostbyname
daniconv
, gunakandlopen
secara internal (sehingga perilaku mereka dapat dikonfigurasi-runtime). Untungnya, ABI untuk libc dan libstdc ++ sangat stabil, sehingga Anda tidak akan menemui masalah yang menghubungkan mereka secara dinamis.sumber
Saya setuju dengan poin terakhir mattnz: pertanyaan ini adalah pertanyaan yang dimuat. Ini mengasumsikan bahwa tautan statis itu buruk. Saya dapat memikirkan dua alasan mengapa ini tidak terjadi:
Tautan statis aman: jika pustaka bersama diperbarui sehingga aplikasi menggunakan yang baru (mungkin yang baru menimpa yang lama, atau yang lama dihapus), itu dapat menimbulkan risiko bahwa versi baru merusak aplikasi. Ini adalah perubahan kode di luar lingkup pembaruan resmi untuk aplikasi. Mungkin belum diuji. Menghubungkan statis menghindari ini dengan tidak berbagi perpustakaan secara eksternal. Saya berpendapat bahwa ini merupakan kerugian bagi perpustakaan bersama karena risiko ini. Bagaimana jika versi baru dari shared library memperkenalkan bug baru yang merusak beberapa aplikasi lama?
Menghubungkan statis memastikan aplikasi lebih mandiri. Meskipun pustaka bersama dapat dikolokasi dengan executable primer, seringkali pustaka disimpan di lokasi bersama. Aplikasi yang terhubung secara statis lebih mudah untuk memastikan "portable" dalam arti "tidak memerlukan perubahan pada file, direktori atau pengaturan yang dimiliki oleh OS" (pikirkan direktori Windows, registry, / dll).
sumber
Perpustakaan statis dan dinamis masing-masing memiliki kegunaannya sendiri. Melihat satu aplikasi dalam ruang lingkup kami mendapatkan ide yang berbeda tentang apa yang perlu dan apa yang tidak.
Menghubungkan statis secara drastis menyederhanakan penyebaran aplikasi. Tidak harus mendeteksi dan menangani versi yang berbeda. Cukup bakar dan gunakan.
Keuntungan yang jelas dengan perpustakaan dinamis adalah kemampuan untuk menerapkan pembaruan secara mandiri.
Ini adalah salah satu alasan saya membenci maven dan pembangun proyek menghubungkan dinamis serupa lainnya untuk java. Mereka mengharapkan versi pustaka tunggal tersedia di url yang diberikan selamanya. Tidak memahami masalah yang terjadi dalam 10 tahun ketika tidak ada yang bisa mengkompilasi aplikasi karena semua sumber dan stoples hilang.
sumber
FooLib1.8
untuk dapat memasukkan kode untuk pustaka itu dalam paket yang dapat dieksekusi dengan cara standar, sehingga memungkinkan utilitas pemutakhiran yang dikirimkanFooLib1.9
untuk meningkatkan atau menurunkannya? Kode cara disimpan di Classic Macintosh akan membuatnya sangat mudah; adakah alasan mengapa sistem saat ini tidak dapat melakukannya dengan lebih baik?