Osx üzerindeki .so ve .dylib arasındaki farklar nelerdir?


214

.dylib, OSX'teki dinamik kitaplık uzantısıdır, ancak geleneksel bir unix .so paylaşılan nesnesini kullanamadığım / kullanamadığım zaman hiçbir zaman net değildi.

Sorularımdan bazıları:

  • Kavramsal düzeyde, .so ve .dylib arasındaki temel farklar nelerdir?
  • Birini diğeri ne zaman kullanabilir / kullanmalıyım?
  • Derleme hileleri ve ipuçları (Örneğin, osc üzerinde çalışmadığı için gcc -shared -fPIC'in değiştirilmesi)

Yanıtlar:


206

Mac OS X tarafından yürütülebilir dosyalar ve kitaplıklar için kullanılan Mach-O nesne dosyası formatı, paylaşılan kitaplıklar ve dinamik olarak yüklenmiş modüller arasında ayrım yapar . otool -hv some_fileÖğesinin dosya türünü görmek için kullanın some_file.

Mach-O paylaşılan kütüphaneleri dosya türüne sahiptir MH_DYLIBve .dylib uzantısını taşır. Bunlar, örneğin -lfoolibfoo.dylib gibi, normal statik bağlayıcı bayrakları ile bağlanabilir. -dynamiclibBayrak derleyiciye geçirilerek oluşturulabilirler . ( -fPICvarsayılan değerdir ve belirtilmesi gerekmez.)

Yüklenebilir modüllere Mach-O konuşmasında "paketler" denir. Dosya türüne sahiptirler MH_BUNDLE. Herhangi bir uzantıyı taşıyabilirler; uzantı .bundleApple tarafından önerilir, ancak çoğu taşınan yazılım .souyumluluk amacıyla kullanır . Genellikle, bir uygulamayı genişleten eklentiler için paketler kullanırsınız ; bu gibi durumlarda, paket uygulamanın dışa aktarılan API'sine erişmek için uygulama ikili dosyasına bağlanır. -bundleBayrak derleyiciye geçirilerek oluşturulabilirler .

Dylibs ve demetleri Hem dinamik kullanılarak yüklenebilir dlAPI'leri (örneğin dlopen, dlclose). Paylaşılan kütüphanelermiş gibi paketler arasında bağlantı kurmak mümkün değildir. Ancak, bir paketin gerçek paylaşımlı kütüphanelere bağlanması mümkündür; bunlar paket yüklendiğinde otomatik olarak yüklenecektir.

Tarihsel olarak, farklılıklar daha anlamlıydı. Mac OS X 10.0'da, kitaplıkları dinamik olarak yüklemenin bir yolu yoktu. Paketleri yüklemek ve boşaltmak için 10.1 ile bir dizi dyld API'si (örn NSCreateObjectFileImageFromFile. NSLinkModule) Sokuldu, ancak dylibs için çalışmadılar. dlopen10.3'te paketlerle çalışan bir uyumluluk kütüphanesi eklendi; 10.4'de, dlopenbir dyld doğal bir parçası ve ilave yükleme için destek (ancak boşaltma) dylibs olması için yeniden. Son olarak, 10.5 dlclosedylibs ile kullanım için destek ekledi ve dyld API'leri kullanımdan kaldırdı.

Linux gibi ELF sistemlerinde her ikisi de aynı dosya biçimini kullanır ; herhangi bir paylaşılan kod parçası kütüphane olarak ve dinamik yükleme için kullanılabilir.

Son olarak, Mac OS X, unutmayın "Gruba" olabilir de yürütülebilir kod ve kod tarafından kullanılan kaynaklar tutan bir standardize yapıyla dizinlere bakın. Bazı kavramsal çakışmalar vardır (özellikle genellikle Mach-O demeti biçiminde yürütülebilir kod içeren eklentiler gibi "yüklenebilir demetler" ile), ancak yukarıda tartışılan Mach-O demetleriyle karıştırılmamalıdır.

Ek referanslar:


1
Bu kapsamlı yorum için teşekkür ederim :) Doğru anlıyorum, başka bir paketten bir paket yüklersem (yani yol app -> paket A -> paket B), o zaman paket B herhangi bir şeyi göremez A paketindeki semboller? Evet ise, bunu bir şekilde çözmenin bir yolu var mı? Az önce vurdum, sanırım: stackoverflow.com/questions/4193539/…
Mikhail Edoshin

4
@noloader: -dynamiclibbir GCC bayrağıdır. Derleyicinin ld'ye geçmesini -dylibsağlar.
Miles

Mac OSX üzerinde ld man sayfası için güncellenmiş URL: manpages.info/macosx/ld.1.html
netpoetica

18

.So dosyası, paylaşılan kitaplık için UNIX dosya uzantısı değil.

Bu sadece sıradan bir şey.

ArnaudRecipes sharedlib sayfasında 3b hattını kontrol edin

Temel olarak .dylib, paylaşılan bir lib'i belirtmek için kullanılan mac dosya uzantısıdır.


9
@ninefingers. Doğru. Ancak, bazı araçlar çok açık bir şey olmadığı sürece varsayılan değerleri kullanacaktır. Örneğin, -l <lib> bayrağı kullanıldığında derleyiciler orada platforma özel paylaşılan libray uzantısını kullanır (gerçek bayrak derleyiciler arasında olabilir).
Martin York

14

Mac os x üzerinde .dylib ve .so arasındaki fark nasıl derlendiğidir. .So dosyaları için -shared, .dylib için -dynamiclib kullanırsınız. .So ve .dylib dosyalarının her ikisi de dinamik kitaplık dosyaları olarak değiştirilebilir ve DYLIB veya BUNDLE türünde olabilir. Bunu gösteren farklı dosyalar için okuma heres.

libtriangle.dylib:
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64  X86_64        ALL  0x00       DYLIB    17       1368   NOUNDEFS DYLDLINK TWOLEVEL NO_REEXPORTED_DYLIBS



libtriangle.so:
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64  X86_64        ALL  0x00       DYLIB    17       1256   NOUNDEFS DYLDLINK TWOLEVEL NO_REEXPORTED_DYLIBS

triangle.so:
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64  X86_64        ALL  0x00      BUNDLE    16       1696   NOUNDEFS DYLDLINK TWOLEVEL

İkisinin Mac OS X'te eşdeğer olmasının nedeni, .so dosya türünü derleyen diğer UNIX OS programlarıyla geriye dönük uyumluluktur.

Derleme notları: ister bir .so dosyasını ister bir .dylib dosyasını derleyin, bağlantı adımı sırasında dinamik kitaplığa doğru yolu eklemeniz gerekir. Bunu, -install_name ve linking komutunun dosya yolunu ekleyerek yaparsınız. Bunu yapmazsanız, bu yayında görülen sorunla karşılaşacaksınız: Mac Dynamic Library Craziness (Yalnızca Fortran olabilir) .


dosyaları paketlemek yerine nasıl dosya ./configureoluşturabilirim ? bu görevi yerine getirmez. .dylib.so./configure --enable-shared
Admia

Deneyimlerime göre, yapılandırma dosyaları standart unix / linux dosya adlarını kullandığından, mac'teki çoğu yapılandırma dosyası bir .so dosyası veya statik kitaplık dosyası oluşturur.
Zachary Kraus

4

Sadece cmake ile OSX üzerinde saf kod oluştururken yaptığım bir gözlem:

cmake ... -DBUILD_SHARED_LIBS=OFF ...

.so dosyaları oluşturur

süre

cmake ... -DBUILD_SHARED_LIBS=ON ...

.dynlib dosyaları oluşturur .

Belki bu herkese yardım eder.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.