2011-12-22 23 views
11

.dll/.libs öğesinin nasıl kullanılacağı konusunda genel bir sorum var. Projem için kullanılacak bir .dll oluşturuyorum, ancak derlemeye başladığımda .lib ile ilişkili .lib ile ilişkili olan .lib dosyasını derlemek için statik olarak bağladığımı fark ettim (aksi halde bağlantı hatası var) hata LNK1107: geçersiz veya bozuk dosya: 0x300 "okuyamıyor"). Bu yüzden daha sonra projemi yeniden tasarladığımda, daha sonra da güncelleyin, sadece yeni bir .dll yerine yeni bir .exe ve yeni bir .dll göndermem gerekecek mi? Bu durumda, neden .dll kullanmanın rahatsız?Lib ve DLL bir exe hatasına bağlanma "0x300'de okunamaz"

cevap

29

.lib, DLL tarafından dışa aktarılan işlevler vb. Için taslakları içerir. .lib dosyasını EXE'inize bağladınız ve şimdi EXE'iniz işlevleri nasıl çağırılacağını biliyorsunuz. Ama elbette orada bir işlev yok - aramalar hiçbir yere gitmiyor. Yükleme zamanında, işletim sistemi EXE'inizi yüklediğinde, DLL'inizi de yükler ve sonra EXE'i EXE dosyasının bulunduğu yere yükler. Yükleyici, DLL'deki gerçek işleve bir çağrı ile yer değiştirir.

Normalde .lib ürününü müşterilerinize göndermeniz gerekmez. Ancak, müşterileriniz kendi DLL'lerini kullanan kendi EXE'lerini yazmak isterlerse, bunları .lib dosyasını ona karşı bağlayabilmeleri için .lib dosyasını göndermeniz gerekir.

Linker hatası LNK1107, .lib dosyasına değil, DLL'ye bağlanmaya çalıştığınız anlamına gelir. Bu her zaman yanlıştır, çünkü tanım gereği bir DLL, çalışma zamanında statik olarak değil, çalışma zamanında dinamik olarak bağlanır.

+0

Ne önerdiğinizi deneyiyorum. Benim sorunum, hata ayıklama modunda oluşturduğumda lib dosyası oluşturulmamasıdır. Sadece dll dosyası üretildi. Debug sürümünde lib dosyasını nasıl oluşturabilirim. –

+0

Yorumunuz, sürüm oluşturma işleminde bir lib dosyası aldığınızı, ancak hata ayıklama yapısında olmadığınızı gösteriyor gibi görünüyor. Bu doğru mu? Öyleyse, her iki yapılandırmada aynı bağlayıcı seçeneklerini ayarladığınızdan emin olun (yayınlama ve hata ayıklama arasında farklı olması gerekenler dışında elbette.) –

+0

Normalde DLL dosyanız varsa, otomatik olarak içe aktarma kitaplığını oluşturur. __declspec (dllexport) özniteliği ile işlev görür veya işlevleri bir DEF dosyasıyla açıkça dışa aktarırsanız. Belki de sizin __declspec (dllexport) derleyici tarafından hariç tutulur, çünkü #ifndef (_DEBUG) veya bunun gibi bir şeyle çevrelenir? –

İlgili konular