Statik kitaplığın, statik olarak bağlı dinamik kitaplığın ve dinamik olarak bağlantılı dinamik kitaplığın .lib dosyasının içinde ne var?


84

Statik kitaplığın, statik olarak bağlantılı dinamik kitaplığın ve dinamik olarak bağlantılı dinamik kitaplığın .lib dosyasının içinde ne var?

Dinamik olarak bağlı dinamik kitaplıkta bir .lib dosyasına gerek yoktur ve ayrıca statik bağlamada .lib dosyası, tüm yöntemlerle bir .obj dosyasından başka bir şey değildir. Bu doğru mu?


4
Sorunun MS Windows platformu ile ilgili olduğu not edilebilir.
cubuspl42

Yanıtlar:


147

Statik bir kitaplık için, .lib dosyası kitaplığın tüm kodunu ve verilerini içerir. Bağlayıcı daha sonra ihtiyaç duyduğu bitleri tanımlar ve bunları son yürütülebilir dosyaya koyar.

Dinamik bir kitaplık için .lib dosyası, kitaplıktan dışa aktarılan işlevlerin ve veri öğelerinin bir listesini ve bunların hangi DLL'den geldiği hakkında bilgi içerir. Bağlayıcı son yürütülebilir dosyayı oluşturduğunda, kitaplıktaki işlevlerden veya veri öğelerinden herhangi biri kullanılırsa, bağlayıcı DLL'ye bir başvuru ekler (Windows tarafından otomatik olarak yüklenmesine neden olur) ve yürütülebilir dosyanın içe aktarma tablosuna girişler ekler. işleve yapılan bir çağrı bu DLL'ye yeniden yönlendirilir.

Dinamik kitaplığı kullanmak için .lib dosyasına ihtiyacınız yoktur, ancak bir tane olmadan DLL'deki işlevleri kodunuzdaki normal işlevler olarak değerlendiremezsiniz. Bunun yerine LoadLibrary, DLL'yi (ve FreeLibraryişiniz bittiğinde) yüklemek ve DLL'deki GetProcAddressişlev veya veri öğesinin adresini almak için el ile çağırmanız gerekir . Daha sonra, döndürülen adresi kullanmak için uygun bir işleve işaretçi çevirmelisiniz.


4
Uzun bir aramadan sonra, IMO, lib & dll kullanarak en iyi cevabı aldım. Teşekkürler
Jeet

@Anthony Williams, "Dinamik bir kitaplık için, .lib dosyası kitaplıktan dışa aktarılan işlevlerin ve veri öğelerinin bir listesini ve bunların hangi DLL'den geldiklerine ilişkin bilgileri içerir." Dediğinizde, "içe aktarma" adlı .lib dosyasıdır. library "normal .lib dosyalarından (" statik kitaplık ") farklı olan?
starriet

Evet, bu bir ithalat kütüphanesi
Anthony Williams

13

Hans'ın aşağıdaki cevabını burada da yararlı buldum . İki tür kitaplık dosyası olabileceği havasını temizliyor.

Programınızı oluşturmak için bir LIB dosyası kullanılır, yalnızca oluşturma makinenizde bulunur ve siz onu göndermezsiniz. İki tür var. Statik bağlantı kitaplığı, tek bir dosyada toplanan .obj dosyalarının bulunduğu bir çantadır. Bağlayıcı, harici bir tanımlayıcıyı çözmesi gerektiğinde dosyadan herhangi bir kod parçasını seçer.

Ancak DLL'lerle daha alakalı olan bir LIB dosyası, bir içe aktarma kitaplığı da olabilir. Daha sonra, DLL'nin adını ve DLL tarafından dışa aktarılan tüm işlevlerin bir listesini içeren basit bir küçük dosyadır. DLL'yi kullanan bir program oluşturduğunuzda, harici bir tanımlayıcının aslında DLL tarafından dışa aktarılan bir işlev olduğunu bilmesi için bunu bağlayıcıya sağlamanız gerekir. Bağlayıcı, EXE için içe aktarma tablosuna girişler eklemek için içe aktarma kitaplığını kullanır. Bu daha sonra, programı çalıştırmak için hangi DLL'lerin yüklenmesi gerektiğini belirlemek için çalışma zamanında Windows tarafından kullanılır.


8

Statik bir kitaplıkta, lib dosyası kitaplık tarafından sağlanan işlevler için gerçek nesne kodunu içerir. Paylaşılan sürümde (statik olarak bağlantılı dinamik kitaplık olarak adlandırdığınız), çalışma zamanında dinamik bağlantıyı kurmak için yeterli kod vardır.

"Dinamik olarak bağlı dinamik kitaplıklar" hakkında emin değilim (programla yüklenir). Bu durumda bir .lib ile bağlantı kuruyor musunuz?

Düzenle:

Gelmekte biraz geç, ama hayır, bir .lib'i bağlamıyorsun. Pekala, içinde libraryloaderex ile lib'e bağlanırsınız. Ancak kullandığınız gerçek kitaplık için, kendi bağlamalarınızı C işlev işaretçileri aracılığıyla sağlarsınız ve yük kitaplığı bunları doldurur.

İşte özet:

Bağlama ǁ Statik | DLL | LoadLibrary
========= ǁ =============== | ====================== | = ==================
API kodu ǁ com- | DLL'de | DLL'de
hayat dolu program | |
--------- ǁ --------------- | ---------------------- | - ------------------
İşlev ǁ Doğrudan, mayıs | Tablo üzerinden dolaylı | Sizin aracılığıyla dolaylı
aramalar ǁ atlanacak | otomatik olarak doldurulur | kendi işlev ptr'leri
--------- ǁ --------------- | ---------------------- | - ------------------
Yük ǁ Derleyici | Derleyici / İşletim Sistemi | Siz / OS

Statik olarak bağlantılı kitaplıklar derken, bir .lib dosyası kullanmayı ve derleme zamanında .dll'yi bağlamayı kastediyorum. Dinamik bağlantı, Win32 API'sinin libraryloaderex () işlevini kullanarak çalışma zamanında .dll'yi bağlamaktadır.
Sulla

6

Bir kitaplık dosyası bağlayıcı tarafından okunur ve yürütme sırasında bir dll dosyası kullanılır. Bir lib dosya yürütme sırasında esas olarak işe yaramaz ve bir bağlayıcı aciz okuma (muhtemelen alakasız bir şekilde burada hariç) Dll.

Statik ve dinamik bağlantı için lib dosyalarının kullanımı arasındaki farklar kafa karıştırıcı olabilir, ancak biraz geçmişi anlarsanız, o zaman çok açık hale gelir.

Başlangıçta yalnızca statik kitaplıklar vardı. Statik bir kitaplık için, .lib dosyası obj dosyalarını içerir. Her obj dosyası, bir ve yalnızca bir derleyici kaynak kodu girdi dosyasının çıktısıdır. Bir lib dosyası, obj dosyalarını bir dizine koymak gibi, sadece ilgili obj dosyalarının bir koleksiyonudur. Bu aslında bir lib dosyasıdır, obj dosyalarından oluşan bir kitaplıktır. Statik bir bağlantı için, bir yürütülebilir dosyanın kullandığı tüm obj dosyaları tek bir dosyada birleştirilir. Bunu, yürütülebilir dosyanın kullandığı diğer koddan ayrı bir dosyada bulunduğu dinamik bir bağlantıyla karşılaştırın.

Dinamik bağlamayı uygulamak için, Microsoft, lib dosyalarının kullanımını, obj dosyasındaki konumlar yerine bir dll dosyasına başvuracak şekilde değiştirdi. Bunun dışında, bir statik bağlantı için bir kitaplıkta bulunan tüm bilgiler, bir dinamik bağlantı için olanla aynıdır. Dinamik bağlantı için bir kitaplık dosyasının dll dosyasını belirtmesi dışında hepsi içlerindeki bilgilerle aynıdır.


1

Dll'lerde, bir exe'deki gibi "şeyler" vardır (her türlü veri, içe aktarma, dışa aktarma, okuma / yazma / çalıştırılabilir bölümler olabilir), ancak fark, bir exe dosyasının yalnızca giriş noktasını (işlevi) dışa aktarmasıdır, ancak dll'nin dışa aktarımını / birçok işlev.

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.