DLL ve LIB dosyaları - ne ve neden?


214

DLL ve LIB's hakkında çok az şey bilmek dışında bir programın düzgün çalışması için gerekli hayati kod içermesi - kütüphaneler. Peki neden derleyiciler bunları üretiyor? Tüm kodu tek bir yürütülebilir dosyaya dahil etmek daha kolay olmaz mıydı? Peki DLL ve LIB'ler arasındaki fark nedir?


Yanıtlar:


298

Statik kütüphaneler (LIB) ve dinamik kütüphaneler (DLL) vardır - ancak .LIB dosyalarının statik kütüphaneler (nesne dosyaları içeren) veya içe aktarma kütüphaneleri (bağlayıcıyı bir DLL'e bağlamasına izin veren simgeler içeren) olabileceğini unutmayın.

Birçok programda kullanmak istediğiniz koda sahip olabileceğiniz için kütüphaneler kullanılır. Örneğin, bir dizedeki karakter sayısını sayan bir işlev yazarsanız, bu işlev birçok programda yararlı olacaktır. Bu işlevi düzgün çalıştıktan sonra, kodu her kullandığınızda yeniden derlemek zorunda kalmazsınız, böylece bu işlevin yürütülebilir kodunu bir kitaplığa koyarsınız ve bağlayıcı derlenmiş kodu ayıklayıp programınıza ekleyebilir . Bu nedenle statik kütüphanelere bazen 'arşiv' denir.

Dinamik kütüphaneler bunu bir adım daha ileri götürür. Her programda yer kaplayan kütüphane işlevlerinin birden fazla kopyasının olması boşa gitmiş gibi görünüyor. Neden hepsi işlevin bir kopyasını paylaşamıyor? Dinamik kütüphaneler bunun içindir. Kitaplık kodunu derlendiğinde programınıza oluşturmak yerine, belleğe yüklenirken programınıza eşleyerek çalıştırılabilir. Aynı işlevleri kullanan aynı anda çalışan birden fazla programın tümü tek bir kopyayı paylaşabilir ve hafızadan tasarruf edebilir. Aslında, kodunuzdaki yola bağlı olarak dinamik kitaplıkları yalnızca gerektiği gibi yükleyebilirsiniz. Herhangi bir yazdırma işlemi yapmıyorsanız, yazıcı yordamlarının belleği kaplamasına gerek yoktur. Öte yandan, bu, programınızın çalıştığı her makineye dinamik kütüphanenin bir kopyasına sahip olmanız gerektiği anlamına gelir.

Örnek olarak, 'C' ile yazılmış hemen hemen her programın 'C çalışma zamanı kitaplığı adı verilen bir kütüphaneden fonksiyonlara ihtiyacı olacaktır, ancak az sayıda programın tüm fonksiyonlara ihtiyacı olacaktır. C çalışma zamanı hem statik hem de dinamik sürümlerde gelir, böylece programınızın belirli gereksinimlere bağlı olarak hangi sürümü kullandığını belirleyebilirsiniz.


81
Çıkıyor .LIBdosyaları ya statik (nesne dosyalarını içerir) kütüphaneler veya ithalat kütüphaneleri (bir DLL bağlantı bağlayıcı izin vermek için semboller içeren) olabilir. Bunun neden böyle olduğunu merak ediyorum.
Lumi

2
iyi açıklama! Kod paylaşılır ve veriler (varsayılan olarak) bir Dll tüketen uygulamalar arasında paylaşılmaz.
mox

4
@Lumi: İyi bir nokta. DLL açısından iki tür bağlantı var. Uygun üstbilgilerle birlikte DLL yaratıcısı tarafından sağlanan bir dosya olduğunda örtük bağlantı.lib ; bu .libyalnızca hedef DLL'nin bir tanımlayıcısıdır, adresler, giriş noktası vb. içerir, ancak kod içermez. Bu .lib, bağlayıcıya iletilmelidir. İkincisi , DLL'yi manuel olarak işlevle yükleyerek kullandığımızda açık bağlantıdırLoadLibrary . Bu türde bu .libdosyaya ihtiyacımız yok , ancak DLL dışa aktarmalarını, adreslerini bulmak ve bu işlevleri işaretçilerle çağırmak için biraz çaba harcamalıyız.
itachi

37

Diğer bir yönü güvenliktir (gizleme). Bir parça kod ana uygulamadan çıkartıldıktan ve "ayrılmış" Dinamik Bağlantı Kitaplığı'na konduktan sonra, izole edildiği için koda saldırmak, analiz etmek (tersine mühendislik) yapmak daha kolaydır. Aynı kod parçası bir LIB Kitaplığı'nda tutulduğunda, derlenmiş (bağlantılı) hedef uygulamanın bir parçasıdır ve bu nedenle bu kod parçasını hedef ikili dosyaların geri kalanından ayırmak (ayırt etmek) daha zordur.


Güvenlik yönü benim için yeniydi. Yukarıdaki muhakeme yerel yönetilmeyen bir C ++ dll çağıran bir C # uygulaması durumunda geçerli mi?
Martin

1
Ama LIB de izole, değil mi? Böylece bir Saldırgan LIB'yi analiz edebilir. Yoksa LIB'nin halka açık olmaması yaygın bir senaryo mu?
Nick Russler

8
derleyici işlemi söz konusu olduğunda LIB "izole", ancak bağlayıcı parçaları bir araya bir kez LIB EXE bir parçasıdır ve kendi kodunuzdan ayırt edilemez.
mox

17

Kodu bir yürütülebilir dosyaya derlemek yerine bir DLL / LIB oluşturmak için önemli bir neden yeniden kullanma ve yer değiştirme. Ortalama bir Java veya .NET uygulaması (örneğin) büyük olasılıkla birkaç üçüncü taraf (veya çerçeve) kitaplığı kullanacaktır. 3. taraf kodlarının tümünü uygulamanızda derlemek yerine, önceden oluşturulmuş bir kitaplığa karşı derlemek çok daha kolay ve hızlıdır. Kodunuzu kitaplıklara derlemek, örneğin sınıflarınızı farklı uygulama türlerinde kullanılacak şekilde tasarlamak gibi iyi tasarım uygulamalarını da teşvik eder.


7

DLL, diğer yürütülebilir programlar arasında paylaşılan işlevler kitaplığıdır. Sadece windows / system32 dizininize bakın ve onlarca bulacaksınız. Programınız bir DLL oluşturduğunda, normalde bir lib dosyası oluşturur, böylece uygulama * .exe programı DLL'de bildirilen sembolleri çözebilir.

Bir .lib, statik olarak bir programa bağlı işlevler kitaplığıdır - diğer programlar tarafından paylaşılmaz. * .Lib dosyasıyla bağlantı kuran her program, o dosyadaki tüm kodlara sahiptir. C.lib ile bağlantı kuran iki A.exe ve B.exe programınız varsa, her A ve B'nin her ikisi de C.lib'deki kodu içerecektir.

DLL'leri ve kütüphaneleri nasıl oluşturduğunuz, kullandığınız derleyiciye bağlıdır. Her derleyici bunu farklı yapar.


4

Bir diğer fark performansta yatmaktadır.

DLL çalışma zamanında .exe (ler) tarafından yüklenirken, .exe (ler) ve DLL paylaşılan bellek konseptiyle çalışır ve dolayısıyla performans statik bağlantıya göre düşüktür.

Öte yandan, bir .lib, derleme sırasında istediği her işleme statik olarak bağlanan koddur. Bu nedenle .exe (ler) tek bir belleğe sahip olacak ve böylece işlemin performansını artıracaktır.

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.