Statik ve paylaşılan kütüphaneler arasındaki fark nedir?
Eclipse kullanıyorum ve Statik Kütüphaneler ve Paylaşılan Kütüphaneler gibi çeşitli proje türleri var mı? Birinin diğerine göre bir avantajı var mı?
Statik ve paylaşılan kütüphaneler arasındaki fark nedir?
Eclipse kullanıyorum ve Statik Kütüphaneler ve Paylaşılan Kütüphaneler gibi çeşitli proje türleri var mı? Birinin diğerine göre bir avantajı var mı?
Yanıtlar:
Paylaşılan kütüphaneler .so (veya Windows .dll veya OS X .dylib) dosyalarıdır. Kütüphaneyle ilgili tüm kodlar bu dosyadadır ve çalışma zamanında onu kullanan programlar tarafından referans verilir. Paylaşılan kitaplığı kullanan bir program yalnızca paylaşılan kitaplıkta kullandığı koda başvurur.
Statik kütüphaneler .a (veya Windows .lib) dosyalardır. Kütüphaneyle ilgili tüm kodlar bu dosyadadır ve derleme zamanında doğrudan programa bağlanır. Statik kitaplık kullanan bir program, kullandığı kodun statik kitaplıktan kopyalarını alır ve programın bir parçası haline getirir. [Windows ayrıca .dll dosyalarına başvurmak için kullanılan .lib dosyalarına sahiptir, ancak ilk dosya ile aynı şekilde çalışırlar].
Her yöntemin avantajları ve dezavantajları vardır:
Paylaşılan kitaplıklar, kitaplıkları kullanan her programda çoğaltılan kod miktarını azaltır ve ikili dosyaları küçük tutar. Ayrıca, paylaşılan nesneyi işlevsel olarak eşdeğer olan, ancak onu kullanan programı yeniden derlemenize gerek kalmadan performans avantajları eklenmiş olabilecek bir nesneyle değiştirmenize de olanak tanır. Bununla birlikte, paylaşılan kütüphaneler, işlevlerin yürütülmesi için küçük bir ek maliyete ve çalışma zamanı yükleme maliyetine sahip olacaktır, çünkü kütüphanedeki tüm sembollerin kullandıkları şeylere bağlanması gerekir. Ayrıca, paylaşılan kütüphaneler, ikili eklenti sistemlerinin uygulanması için genel mekanizma olan çalışma zamanında bir uygulamaya yüklenebilir.
Statik kütüphaneler ikilinin toplam boyutunu arttırır, ancak kullanılan kütüphanenin bir kopyasını yanınızda taşımanız gerekmez. Kod derleme zamanında bağlandığından, ek çalışma zamanı yükleme maliyeti yoktur. Kod sadece orada.
Şahsen, paylaşılan kütüphaneleri tercih ederim, ancak ikili kütüphanenin C ++ standart kütüphanesinin belirli sürümleri veya Boost C ++ kütüphanesinin belirli sürümleri gibi karşılamak için zor olabilecek birçok dış bağımlılığa sahip olmadığından emin olmak gerektiğinde statik kütüphaneler kullanıyorum.
Statik kütüphane kitapçı gibidir ve paylaşılan kütüphane ... kütüphane gibidir. İlkiyle, eve götürmek için kitabın / fonksiyonun kendi kopyasını alırsınız; ikincisi ile siz ve diğer herkes aynı kitabı / işlevi kullanmak için kütüphaneye gidersiniz. Bu yüzden (paylaşılan) kütüphaneyi kullanmak isteyen herkesin nerede olduğunu bilmesi gerekir, çünkü kitabı / işlevi “gitmeye” ihtiyacınız vardır. Statik bir kütüphane ile kitabın / fonksiyonun size ait olması ve onu evinizin / programınızın içinde tutmanız ve bir kez sahip olduğunuzda nerede veya ne zaman aldığınız umurumda değil.
Basitleştirilmiş:
Statik bir kitaplık için kod, bağlayıcı tarafından kitaplıktan çıkarılır ve uygulamanızı derlediğiniz / oluşturduğunuz noktada son yürütülebilir dosyayı oluşturmak için kullanılır. Son yürütülebilir dosyanın çalışma zamanında kitaplığa bağımlılığı yoktur
Paylaşılan bir kitaplık için, derleyici / bağlayıcı, uygulama oluşturulduğunda bağlandığınız adların kitaplıkta var olup olmadığını kontrol eder, ancak kodlarını uygulamaya taşımaz. Çalışma zamanında, paylaşılan kitaplık kullanılabilir olmalıdır.
C programlama dilinin kendisinin statik veya paylaşılan kitaplık kavramı yoktur - tamamen bir uygulama özelliğidir.
Şahsen, yazılım dağıtımını kolaylaştırdığı için statik kütüphaneleri kullanmayı tercih ederim. Bununla birlikte, bu geçmişte çok (figüratif) kanın aktığı bir görüştür.
Statik kütüphaneler bir uygulamanın parçası olarak derlenirken, paylaşılan kütüphaneler derlenmez. Paylaşılan liberlere bağlı bir uygulamayı dağıtırsanız, kütüphaneler, ör. MS Windows üzerinde dll yüklü olması gerekir.
Statik kütüphanelerin avantajı, uygulamayı çalıştıran kullanıcı için herhangi bir bağımlılığın gerekli olmamasıdır - örneğin DLL'lerini herhangi bir şekilde yükseltmeleri gerekmez. Dezavantajı, uygulamanızın boyutunun daha büyük olmasıdır, çünkü ihtiyacınız olan tüm kütüphanelerle birlikte gönderiyorsunuz.
Paylaşılan kitaplıklar, daha küçük uygulamalara yol açmanın yanı sıra, kullanıcıya uygulamanın bir parçası olandan ziyade kendi kitaplıklarını, belki de daha iyi bir sürümünü kullanma olanağı sunar
Paylaşılan kitaplıkların en önemli avantajı, kitaplığı kaç işlem kullanıyor olursa olsun, belleğe yüklenen kodun yalnızca bir kopyasının olmasıdır. Statik kütüphaneler için her işlem kodun kendi kopyasını alır. Bu önemli bellek israfına yol açabilir.
Statik kütüphanelerin bir avantajı olan OTOH, her şeyin uygulamanızda bir araya gelmesidir. Bu nedenle, istemcinin sistemlerinde doğru kitaplığa (ve sürüme) sahip olduğundan endişelenmenize gerek yoktur.
.so
* nix sistemlerindeki dosyalar biraz paylaşılan (dinamik) kütüphanedir.
Diğer tüm cevapların yanı sıra, henüz bahsedilmeyen bir şey de ayrıştırmaktır:
İlgilendiğim gerçek bir dünya üretim kodu hakkında konuşmama izin verin:
300'den fazla projeden (görsel stüdyo ile) yapılmış çok büyük bir yazılım, çoğunlukla statik lib olarak inşa edilir ve son olarak büyük bir yürütülebilir dosyada birbirine bağlanır, aşağıdaki sorunlarla karşılaşırsınız:
-Bağlantı süresi çok uzun. Diyelim ki 10 dakikadan fazla derleme zamanı -Bazı araçlar dizinde, kodu kullanması gereken bellek kontrol araçları gibi büyük bir yürütülebilir dosya ile bağlantı kurabilirler. Aptal olarak görülen sınırlara ulaşabilirsin.
Daha sorunlu olan, yazılımınızın ayrıştırılmasıdır: bu gerçek dünya örneğinde, her projenin başlık dosyalarına diğer projelerden erişilebilir. Sonuç olarak bir geliştiricinin bağımlılık eklemesi son derece kolaydı; sadece üstbilgiyi eklemekle ilgiliydi, çünkü sonunda bağlantı allwaws sembolleri bulacak. Korkunç bisiklet bağımlılıkları ve tam karışıklık ile sonuçlanır.
Paylaşılan kitaplıkla, geliştiricinin bağımlı kitaplığı eklemek için proje oluşturma sistemini düzenlemesi gerektiğinden, bu biraz fazladan bir iştir. Paylaşılan kütüphane kodunun daha temiz bir kod API'si sunma eğiliminde olduğunu gözlemledim.
-------------------------------------------------------------------------
| +- | Shared(dynamic) | Static Library (Linkages) |
-------------------------------------------------------------------------
|Pros: | less memory use | an executable, using own libraries|
| | | ,coming with the program, |
| | | doesn't need to worry about its |
| | | compilebility subject to libraries|
-------------------------------------------------------------------------
|Cons: | implementations of | bigger memory uses |
| | libraries may be altered | |
| | subject to OS and its | |
| | version, which may affect| |
| | the compilebility and | |
| | runnability of the code | |
-------------------------------------------------------------------------