.dll
atau .so
shared libs (ditautkan dalam runtime), sementara.a
dan .lib
merupakan pustaka statis (ditautkan dalam waktu kompilasi). Ini tidak ada perbedaan antara Windows dan Linux.
Bedanya, bagaimana mereka ditangani. Catatan: perbedaannya hanya di bea cukai, bagaimana mereka digunakan. Tidak akan terlalu sulit untuk membuat Linux dibangun berdasarkan cara Windows dan sebaliknya, kecuali bahwa praktis tidak ada yang melakukan ini.
Jika kita menggunakan dll, atau kita memanggil fungsi bahkan dari biner kita sendiri, ada cara yang sederhana dan jelas. Misalnya, dalam C, kita melihat bahwa:
int example(int x) {
...do_something...
}
int ret = example(42);
Namun, pada tingkat ASM, mungkin ada banyak perbedaan. Misalnya, pada x86, call
opcode dieksekusi, dan 42
diberikan pada stack. Atau di beberapa register. Atau dimana saja. Tidak ada yang tahu itu sebelum menulis dll , bagaimana ini akan digunakan. Atau bagaimana proyek ingin menggunakannya, mungkin ditulis dengan kompiler (atau dalam bahasa!) Yang bahkan tidak ada sekarang (atau tidak diketahui oleh pengembang dll).
Sebagai contoh, secara default, C dan Pascal menempatkan argumen (dan mendapatkan nilai balik) dari stack - tetapi mereka melakukannya dalam urutan yang berbeda . Anda juga dapat bertukar argumen antara fungsi Anda di register dengan beberapa - pengoptimalan-bergantung-kompiler.
Seperti yang Anda lihat dengan benar, kebiasaan Windows adalah membangun dll, kami juga membuat minimal .a
/ .lib
dengannya. Pustaka statis minimal ini hanya pembungkus, simbol (fungsi) dll yang dicapai melaluinya. Ini membuat konversi panggilan tingkat-asm yang diperlukan.
Keuntungannya adalah kompatibilitas. Kerugiannya adalah bahwa jika Anda hanya memiliki .dll, Anda dapat mengalami kesulitan untuk mencari tahu, bagaimana fungsinya ingin dipanggil. Ini membuat penggunaan dll sebagai tugas peretasan, jika pengembang dll tidak memberi Anda.a
. Dengan demikian, ini melayani sebagian besar tujuan penutupan, misalnya jadi apakah lebih mudah untuk mendapatkan uang tunai tambahan untuk SDK.
Kerugian lainnya adalah daripada bahkan jika Anda menggunakan perpustakaan dinamis, Anda perlu mengkompilasi pembungkus kecil ini secara statis.
Di Linux, antarmuka biner dari dll adalah standar dan mengikuti konvensi C. Dengan demikian, tidak .a
diperlukan dan ada kompatibilitas biner antara lib yang dibagikan, sebagai gantinya kami tidak memiliki kelebihan dari kebiasaan microsoft.