Format file objek Mach-O yang digunakan oleh Mac OS X untuk executable dan pustaka membedakan antara pustaka bersama dan modul yang dimuat secara dinamis . Gunakan otool -hv some_file
untuk melihat tipe file dari some_file
.
Pustaka bersama Mach-O memiliki tipe file MH_DYLIB
dan membawa ekstensi .dylib. Mereka dapat dihubungkan dengan flag tautan statis biasa, misalnya -lfoo
untuk libfoo.dylib. Mereka dapat dibuat dengan mengirimkan -dynamiclib
bendera ke kompiler. ( -fPIC
adalah default dan tidak perlu ditentukan.)
Modul yang dapat dimuat disebut "bundel" dalam bahasa Mach-O. Mereka memiliki tipe file MH_BUNDLE
. Mereka dapat membawa ekstensi apa pun; ekstensi .bundle
direkomendasikan oleh Apple, tetapi sebagian besar perangkat lunak porting menggunakan .so
demi kompatibilitas. Biasanya, Anda akan menggunakan bundel untuk plug-in yang memperpanjang aplikasi; dalam situasi seperti itu, bundel akan terhubung dengan biner aplikasi untuk mendapatkan akses ke API yang diekspor aplikasi. Mereka dapat dibuat dengan mengirimkan -bundle
bendera ke kompiler.
Baik dylib dan bundel dapat dimuat secara dinamis menggunakan dl
API (mis. dlopen
, dlclose
). Tidak mungkin untuk menautkan ke bundel seolah-olah mereka adalah perpustakaan bersama. Namun, ada kemungkinan bahwa bundel terkait dengan perpustakaan bersama nyata; itu akan dimuat secara otomatis ketika bundel dimuat.
Secara historis, perbedaannya lebih signifikan. Di Mac OS X 10.0, tidak ada cara untuk memuat pustaka secara dinamis. Serangkaian API dyld (misalnya NSCreateObjectFileImageFromFile
, NSLinkModule
) diperkenalkan dengan 10.1 untuk memuat dan membongkar bundel, tetapi mereka tidak bekerja untuk dylibs. Sebuah dlopen
perpustakaan kompatibilitas yang bekerja dengan bundel ditambahkan di 10.3; pada 10.4, dlopen
ditulis ulang menjadi bagian asli dari dyld dan menambahkan dukungan untuk memuat (tetapi tidak menurunkan) dylibs. Akhirnya, 10,5 menambahkan dukungan untuk digunakan dlclose
dengan dylibs dan tidak lagi menggunakan API yang sudah digunakan.
Pada sistem ELF seperti Linux, keduanya menggunakan format file yang sama ; setiap bagian dari kode bersama dapat digunakan sebagai perpustakaan dan untuk pemuatan dinamis.
Akhirnya, ketahuilah bahwa di Mac OS X, "bundle" juga dapat merujuk ke direktori dengan struktur standar yang menyimpan kode yang dapat dieksekusi dan sumber daya yang digunakan oleh kode itu. Ada beberapa tumpang tindih konseptual (terutama dengan "bundel yang dapat dimuat" seperti plugin, yang umumnya berisi kode yang dapat dieksekusi dalam bentuk bundel Mach-O), tetapi mereka tidak harus bingung dengan bundel Mach-O yang dibahas di atas.
Referensi tambahan:
-dynamiclib
adalah bendera GCC. Itu membuat kompiler lolos-dylib
ke ld.File .so bukan ekstensi file UNIX untuk pustaka bersama.
Kebetulan itu adalah yang biasa.
Periksa baris 3b di halaman ArnaudRecipes sharedlib
Pada dasarnya .dylib adalah ekstensi file mac yang digunakan untuk menunjukkan lib bersama.
sumber
Perbedaan antara .dylib dan .so pada mac os x adalah bagaimana mereka dikompilasi. Untuk file .so Anda menggunakan-shared dan untuk .dylib Anda menggunakan -dynamiclib. Baik .so dan .dylib dapat dipertukarkan sebagai file perpustakaan dinamis dan memiliki tipe sebagai DYLIB atau BUNDLE. Inilah pembacaan untuk berbagai file yang menunjukkan ini.
Alasan keduanya setara pada Mac OS X adalah untuk kompatibilitas mundur dengan program OS UNIX lain yang mengkompilasi ke tipe file .so.
Catatan kompilasi: apakah Anda mengkompilasi file .so atau file .dylib Anda harus memasukkan jalur yang benar ke perpustakaan dinamis selama langkah penautan. Anda melakukan ini dengan menambahkan -install_name dan path file ke perintah penautan. Jika Anda tidak melakukan ini, Anda akan mengalami masalah yang terlihat di posting ini: Mac Dynamic Library Craziness (Mungkin Fortran Only) .
sumber
./configure
untuk menghasilkan.dylib
file daripada file bundel.so
?./configure --enable-shared
tidak melakukan tugas ini.Hanya pengamatan yang baru saja saya buat sambil membuat kode naif di OSX dengan cmake:
membuat file .so
sementara
membuat file .dynlib .
Mungkin ini bisa membantu siapa saja.
sumber