Linux'taki kütüphanelerle ilgili bazı tartışmalara katıldım ve bazı şeyleri doğrulamak istiyorum.
Anladığım kadarıyla (eğer yanlışsam lütfen düzeltin ve daha sonra yazımı düzenleyeceğim), bir uygulama oluştururken kütüphaneleri kullanmanın iki yolu vardır:
- Statik kitaplıklar (.a dosyaları): Bağlantı zamanında, kitaplığın içindeki işlevlerin her zaman çağıran uygulama tarafından kullanılabilmesi için tüm kitaplığın bir kopyası son uygulamaya yerleştirilir.
- Paylaşılan nesneler (.so dosyaları): Bağlantı zamanında nesne, ilgili başlık (.h) dosyası aracılığıyla API'sına göre doğrulanır. Kütüphane, gerekli olan çalışma zamanına kadar kullanılmaz.
Statik kütüphanelerin bariz avantajı, uygulamanın tamamının kendi içinde kalmasına izin vermesidir, dinamik kütüphanelerin yararı ise ".so" dosyasının değiştirilebilmesidir (yani: bir güvenlik nedeniyle güncellenmesi gerektiğinde) bug) temel uygulamanın yeniden derlenmesini gerektirmeden.
Her ikisi de ".so" dosyaları olmasına rağmen bazı kişilerin paylaşılan nesneler ve dinamik bağlantılı kütüphaneler (DLL) arasında bir ayrım yaptığını duydum. Linux'ta C / C ++ geliştirme veya POSIX uyumlu herhangi bir işletim sistemi (yani: MINIX, UNIX, QNX, vb.) Söz konusu olduğunda paylaşılan nesneler ve DLL'ler arasında herhangi bir ayrım var mı? Ben bir anahtar fark (şimdiye kadar) paylaşılan nesneler sadece çalışma zamanında kullanılan olduğunu söylenir, DLL ilk uygulama içinde dlopen () çağrısı kullanılarak açılması gerekir.
Son olarak, bazı geliştiricilerin, benim anlayışımla, aynı zamanda statik kütüphanelerin kendileri olan, ancak hiçbir zaman doğrudan bir uygulama tarafından kullanılmayan "paylaşılan arşivlerden" bahsettiklerini de duydum. Bunun yerine, diğer statik kütüphaneler, paylaşılan arşivden bazı (ancak hepsi değil) işlevleri / kaynakları oluşturulan statik kütüphaneye çekmek için "paylaşılan arşivlere" bağlanır.
Yardımınız için şimdiden teşekkür ederiz.
Güncelleme
Bu terimlerin bana sağlandığı bağlamda, Linux öğrenmek zorunda olan bir Windows geliştiricileri ekibi tarafından kullanılan hatalı terimlerdi. Onları düzeltmeye çalıştım, ancak (yanlış) dil normları sıkıştı.
- Paylaşılan Nesne: Program başladığında otomatik olarak bir programa bağlanan ve bağımsız bir dosya olarak var olan bir kütüphane. Kütüphane derleme zamanında bağlantı listesine dahil edilir (yani:
LDOPTS+=-lmylib
adlı bir kütüphane dosyası içinmylib.so
). Kitaplık derleme zamanında ve uygulama başladığında mevcut olmalıdır. - Statik Kitaplık: Uygulama kodu ve program oluşturulduğunda otomatik olarak bir programa otomatik olarak bağlanan kütüphane kodu ve her ikisini içeren son ikili dosya için tek bir (daha büyük) uygulama için derleme sırasında gerçek programın kendisine birleştirilen kitaplık ana program ve kütüphanenin kendisi tek bir bağımsız ikili dosya olarak bulunur. Kütüphane derleme zamanında bağlantı listesine dahil edilir (yani:
LDOPTS+=-lmylib
mylib.a adlı bir kütüphane dosyası için). Kütüphane derleme zamanında hazır bulunmalıdır. - DLL: Temelde paylaşılan bir nesne ile aynıdır, ancak derleme zamanında bağlantı listesine dahil olmak yerine, kütüphane
dlopen()
/dlsym()
komutları aracılığıyla yüklenir, böylece programın derlenmesi için kitaplığın derleme zamanında hazır olması gerekmez. Ayrıca, kütüphanenin uygulama başlangıcında veya derleme zamanında (zorunlu olarak) bulunması gerekmez , çünkü yalnızcadlopen
/dlsym
çağrıları yapılırken gereklidir . - Paylaşılan Arşiv: Temelde statik bir kütüphane ile aynıdır, ancak "dışa aktarma-paylaşımlı" ve "-fPIC" bayrakları ile derlenmiştir. Kütüphane derleme zamanında bağlantı listesine dahil edilir (yani:
LDOPTS+=-lmylibS
adlı bir kütüphane dosyası içinmylibS.a
). İkisi arasındaki fark, paylaşılan bir nesne veya DLL, paylaşılan arşivi statik olarak kendi koduna bağlamak istiyorsa ve paylaşılan nesnedeki işlevleri yalnızca bunları kullanmak yerine diğer programlar için kullanılabilir hale getirmek istiyorsa, bu ek bayrağın gerekli olmasıdır. dll için dahili. Bu, birisinin size statik bir kitaplık sağlaması ve bunu SO olarak yeniden paketlemek istediğinizde kullanışlıdır. Kütüphane derleme zamanında hazır bulunmalıdır.
Ek Güncelleme
" DLL
" Ve " shared library
" arasındaki ayrım , o zaman çalıştığım şirkette (tembel, yanlış) bir konuşma diliydi (Windows geliştiricileri Linux gelişimine geçmek zorunda kaldı ve sıkıştı terimi), yukarıda belirtilen açıklamalara bağlı olarak.
Ayrıca, S
"paylaşılan arşivler" söz konusu olduğunda, kütüphane adından sonra gelen " " gerçek anlamında, genel olarak sektörde değil, yalnızca bu şirkette kullanılan bir konvansiyon vardı.
.a
dosyalar "a" aslında "archove" anlamına gelir ve bu sadece nesne dosyalarının bir arşiv var. Modern bağlayıcılar while kütüphanesini dahil etmek zorunda kalmayacak kadar iyi olmalıdır, sadece arşivdeki gerekli olan nesne dosyaları ve hatta sadece başvurulan nesne dosyalarındaki kod / veri bölümlerini kullanabilir.