2013-04-06 21 views
22

Sorunumu açıklamak için basit bir bağlantı kullanımıyla başlamak istiyorum. Paylaşılan kitaplık libz.dll (D: /libs/z/shared/libz.dll) veya statik kitaplık libz.a (D:/libs/z/static/libz) için derlenmiş olabilir bir kitaplık z olduğunu varsayalım .a).MinGW ile Statik ve Dinamik/Paylaşımlı Bağlantı

gcc -o main.exe main.o -LD:/libs/z/static -lz 

this documentation göre, gcc üyeleri nesne vardır

arşiv dosyaları olduğu libz.a, aramak olacaktır:

Let Sonra bunu, buna karşı bağlamak istediğiniz dosyalar

ben aşağıdakileri de yapabilir

:

gcc -o main.exe main.o -LD:/libs/z/shared -lz 

Yukarıdaki belgede, işaretinin lib<name>.so için arama yapacağı belirtilmemiştir.

I libz.a ve libz.dll dosyası aynı dizinde olacaksa ne olur? Kütüphane bir programla nasıl bağlantılı olacak? Neden -l hem paylaşılan hem de statik kitaplıklar için arama yapıyorsa, neden -Wl,-Bstatic ve -Wl,-Bdynamic numaralı bayraklara ihtiyacım var?

Paylaşılan kitaplık dağıtımını derlersek, bazı geliştiriciler .dll dosyalarını aynı modüller için neden sağlar? Örneğin, Qt, .dosya dosyalarını lib dizinindeki .a dosyaları içeren bin dizininde sağlar. Örneğin, Qt .dll dosyaları .dosyaları. Aynı kütüphane mi, yoksa paylaşılan ve statik gibi mi oluşturulmuş? Veya .a dosyaları, gerçek kütüphane uygulamalarının olduğu ortak kütüphanelerle bağlantı sağlayan bir çeşit kukla kütüphaneler midir?

Başka bir örnek, Windows'da OpenGL kitaplığıdır. Neden her derleyici MingW'deki libopengl32.a gibi statik OpenGL lib'i sağlamalıdır?

.dll.a ve .la uzantıları ile kullanılan dosyalar nedir?

P.S. Burada birçok soru var, ama sanırım her biri bir öncekine bağlı ve bunları birkaç soruya bölme gereği yok.

+0

Cygwin örneğini ele alalım: benim anlayışım, cygwin ile derlenen programların çalışması için belirli bir dll'ye ihtiyaç duyması. Dll, belirli bir lisansa (ücretsiz olanlardan) bağlıdır ve programın ana bilgisayar sisteminde bulunmalıdır. Bir geliştirici olarak programla birlikte göndermeyi unutursanız, program çalışmaz. Başka bir örnek sürümü çakışan DLL'lerdir (örn. Opengl). Her sistemin farklı yetenekleri vardır ve bu nedenle belirli DLL'lerin farklı uygulamaları vardır. Yani bazen geliştiriciler doğru kütüphane sürümünü kullanmayı severler. – scones

cevap

23

Lütfen ld and WIN32 (cygwin/mingw)'a bir göz atın. Özellikle, , LD'nin Windows bağlantı noktalarındaki -l bayrağının davranışı hakkında daha fazla bilgi için bir dll bölümüne doğrudan bağlantı. Özü:

Örneğin

, ld onun arama yolunun ilk dizininde, bulmaya çalışacaktır -lxxx argümanla çağrıldığında,

libxxx.dll.a 
xxx.dll.a 
libxxx.a 
cygxxx.dll (*) 
libxxx.dll 
xxx.dll 

sonraki dizine geçmeden önce arama yolu

(*) Aslında bu cygxxx.dll değil ama aslında <prefix> ld seçeneği -dll-search-prefix=<prefix> tarafından ayarlanır <prefix>xxx.dll vardır. Cygwin durumunda, standart gcc spec dosyası -dll-search-prefix=cyg içerir, dolayısıyla aslında biz aslında cygxxx.dll'u ararız.

NOT: Hiç MinGW ile Boost inşa varsa, muhtemelen Boost kütüphanelerinin adlandırma aynen yukarıdaki bağlantıda açıklanan desen itaat hatırlıyorum.

Geçmişte orada *.dll doğrudan bağlama ile MinGW sorunları vardı, bu yüzden yerine buna karşı statik *.dll ihraç sembollerle kütüphane lib*.a ve bağlantı oluşturmak için tavsiye edildi. Bu MinGW wiki sayfasının bağlantısı artık öldü, bu yüzden şimdi *.dll'a karşı doğrudan bağlantı kurmanın iyi olacağını varsayalım. Dahası, kendimi birkaç kez en son MinGW-w64 dağılımıyla yaptım ve henüz bir sorunum olmadı.

gcc object1.o object2.o -lMyLib2 -Wl,-Bstatic -lMyLib1 -Wl,-Bdynamic -o output 

yukarıdaki pasajı garantiler: bazen aynı adla dinamik kütüphane de bir arama yolu mevcuttur örneğin, için, statik bağlama zorlamak istiyorum, çünkü

Sen bağlantı bayrakları -Wl,-Bstatic ve -Wl,-Bdynamic gerek -l bayrağının varsayılan bağlantı önceliğinin MyLib1 için geçersiz kılınması, yani arama yolunda MyLib1.dll bulunsa bile, LD karşı bağlantı için libMyLib1.a seçecektir. MyLib2 LD için dinamik versiyonun tekrar tercih edeceğine dikkat edin.

NOT:MyLib2MyLib1 bağlıdır, o zaman MyLib1 dinamik, çok bağlantılıdır bakılmaksızın -Wl,-Bstatic (yani bu durumda göz ardı edilir). Bunu önlemek için MyLib2'u da statik olarak bağlamanız gerekir.