Gcc'ye doğrudan bir kitaplığı statik olarak bağlamasını söylemek


133

Statik olarak hangi kütüphanelerle bağlantı kurmak istediğimi -Wl,-Bstaticsöylemek için kullanmak bana garip geliyor gcc. Sonuçta gcckitaplıklarla ( -Ldir, -llibname) bağlantı kurma hakkındaki diğer tüm bilgileri doğrudan söylüyorum .

Gcc sürücüsüne hangi kitaplıkların statik olarak bağlanması gerektiğini doğrudan söylemek mümkün müdür?

Açıklama: Belirli bir kitaplık sadece statik sürümlerde mevcutsa onu kullanmadan kullanacağını biliyorum -Wl,-Bstatic, ancak gccstatik kitaplığı tercih etmeyi ima etmek istiyorum . Ayrıca kitaplık dosyasını doğrudan belirtmenin onunla bağlantı kuracağını da biliyorum, ancak statik ve dinamik kitaplıkları dahil etmek için anlambilimini aynı tutmayı tercih ediyorum.

Yanıtlar:


189

Elbette -l:yerine kullanmak mümkündür -l. Örneğin -l:libXYZ.abağlantı kurmak için libXYZ.a. Hangisinin otomatik olarak genişleyeceğinin libaksine , yazılanlara dikkat edin .-lXYZlibXYZ


63
Keşke Gnu bunu lib önek çılgınlığı yerine öntanımlı yapsaydı. Oh kurtaracağımız zaman ve hayal kırıklığı.
Timmmm

9
Radek, bu -l:seçenek belgelenmiş mi? Hangi gcc sürümünü kullanmam gerekiyor?
osgx

18
Aslında, bir seçenektir ldbağlayıcı sourceware.org/binutils/docs/ld/Options.html " -l namespecnamespec formunun ise ..: dosya adı, dosya adı adlı bir dosyayı kütüphane yolunu arayacaktır ld, aksi takdirde kütüphane arayacaktır ELF .. sistemlerinde libnamespec.a. .. adlı bir dosya için yol, ld libnamespec.a. adında birini aramadan önce libnamespec.so adlı bir kitaplık için bir dizinde arama yapacaktır. Bu davranışın şunun için geçerli olmadığını unutmayın: dosya adı , her zaman dosya adı adlı bir dosyayı belirtir. ". Binutils yana 2.18 - sourceware.org/binutils/docs-2.18/ld/Options.html
osgx

17
GNU, bu arabirimden hiçbir yerde sorumlu değildir, Unix araç zincirinden miras alınmıştır.
akim

Bunun GNU olmayan bağlayıcılarda çalışmaması büyük bir utanç. LDLIBS ve benzeri yapılandırma seçeneklerini, tuhaf bağlantı işareti geçici çözümleri olmadan statik kitaplıkları bulmaya zorlamanın güzel bir yoludur.
nneonneo

130

Bağlama komutunda .a dosyası ekleyebilirsiniz:

  gcc yourfiles /path/to/library/libLIBRARY.a

Ancak bu, gcc sürücüsüyle değil, ldseçenekler gibi bağlayıcıyla konuşmaktır -Wl,anything.

Gcc veya ld'ye söylediğinizde -Ldir -lLIBRARY, linker kitaplığın hem statik hem de dinamik sürümlerini kontrol eder (ile bir işlemi görebilirsiniz -Wl,--verbose). Kütüphane türleri sırasını değiştirmek için kullanabileceğiniz kontrol -Wl,-Bstaticve -Wl,-Bdynamic. İşte gnu LD'nin man sayfası: http://linux.die.net/man/1/ld

Programınızı dinamik olarak lib1, lib3 ve statik olarak lib2 ile bağlamak için, şu gcc çağrısını kullanın:

gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3

Varsayılan ld ayarının dinamik kitaplıkları (Linux'ta) kullanmak olduğunu varsayarsak.


3
Kısa versiyon: Bunu güncel durumla yapmanın bir yolu yok gcc.
Elazar Leibovich

7
Elazar Leibovich, ama gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3hile yapıyor.
osgx

13
Bağlama (ve dinamik / statik kitaplıkların aranması) bağlayıcı tarafından yapılır, Bu nedenle, Bağlayıcı seçeneklerini kullanmanız gerekir. -lve -Lbağlayıcı seçeneklerdir.
osgx

3
Bu yanıt, gcc yourfiles /path/to/library/libLIBRARY.aveya nedeniyle -Wl,-Bstaticmi yükseltildi ?
Tor Klingberg

7
@TorKlingberg, Varyant 1'in /path/to/library/libLIBRARY.ayazılması için tam yol gerekiyor, varyant 2 -Wl,-Bstatic -llib2 -Wl,-Bdynamicsadece uzun ve 2 ekstra seçenek ekliyor ve varsayılan modu Bdynamic olarak kabul ediyor ve kabul edilen varyant 3 -l:libXYZ.akısa ve çalışıyor. Üçü de birçok durumda işe yarayacaktır ve değişken 2, statik programları bağlarken çalışmayabilir. Kitaplık için gerçek bağlama adımı, anladığım kadarıyla tüm varyantlarda aynı.
osgx
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.