SORU
5 EYLÜL 2008, Cuma


Neden kitaplıkları bağlı emir bazen GCC hataları neden oluyor?

Neden kitaplıkları bağlı emir bazen GCC hataları neden oluyor?

CEVAP
3 Ocak 2009, CUMARTESİ


(Bu cevap hikayesini daha ayrıntılı bir metin için bakınız, ama ben şimdi okuyucu gerçek komut satırlarını görmek daha kolay oluyor sanırım).


Ortak dosyaları komutlar aşağıda herkes tarafından paylaşılan

$ cat a.cpp
extern int a;
int main() {
  return a;
}

$ cat b.cpp
extern int b;
int a = b;

$ cat d.cpp
int b;

Statik kütüphaneler için bağlama

$ g   -c b.cpp -o b.o
$ ar cr libb.a b.o
$ g   -c d.cpp -o d.o
$ ar cr libd.a d.o

$ g   -L. -ld -lb a.cpp # wrong order
$ g   -L. -lb -ld a.cpp # wrong order
$ g   a.cpp -L. -ld -lb # wrong order
$ g   a.cpp -L. -lb -ld # right order

Linker gibi soldan sağa arar ve çözülmemiş semboller notlar. Bir kütüphane sembolü giderir sadece, nesnenin sembolü çözmek için bu kitaplığı (b.dosyaları alır o libb.bu durumda a).

Birbirlerine karşı statik kütüphane bağımlılıkları aynı ihtiyacı sembol öncelikle, sembolü gideren kütüphane sonra olması gereken kütüphane.

Statik bir kütüphane başka bir kütüphane bağlıdır, ama diğer kütüphanenin yeniden eski kütüphane bağlıdır, bir döngü var. Sen-ebilmek çözmek bu kapsayan bisiklet bağımlı kitaplıkları tarafından -( -) gibi -( -la -lb -) (gerekebilir kaçış parens gibi -\( -\)). Linker sonra kez bisiklet bağımlılıkları çözülmüş olduğundan emin olmak için, bu kapalı lib çok arar. Alternatif olarak, her biri diğerinden daha önce. bu yüzden kütüphaneler, birden çok kez belirtebilirsiniz: -la -lb -la.

Dinamik kütüphane bağlantı

$ export LD_LIBRARY_PATH=. # not needed if libs go to /usr/lib etc
$ g   -fpic -shared d.cpp -o libd.so
$ g   -fpic -shared b.cpp -L. -ld -o libb.so # specifies its dependency!

$ g   -L. -lb a.cpp # wrong order (works on some distributions)
$ g   -Wl,--as-needed -L. -lb a.cpp # wrong order
$ g   -Wl,--as-needed a.cpp -L. -lb # right order

Burada da aynısı var - kütüphaneler programın nesne dosyalarını takip etmek zorundadır. Fark burada statik kitaplıkları ile birbirimizi, çünkü karşı kütüphane bağımlılıkları hakkında bakım gerekirdinamik kütüphane bağımlılıklarını kendileri çözmek.

Bazı yeni dağıtımlar anlaşılan programın nesne dosyaları dinamik kütüphaneleri önce gelen zorlar --as-needed linker bayrağı, kullanarak varsayılan. Eğer o bayrağı geçirilir, linker aslında çalıştırılabilir (ve sağdan sola doğru bu algılar) tarafından gerekli kütüphaneleri için bir bağlantı olacaktır. Son archlinux dağılımını doğru sırayı takip etmiyor bir hata vermedi yani varsayılan olarak bu bayrağı kullanmaz.

Eski oluştururken d.so karşı b.so bağımlılığını ihmal etmek doğru değildir. Sen-ecek var olmak gerekli için belirtmek kütüphane bağlantı a ama a değil gerçekten ihtiyacınız tamsayı b kendisi, yani olmaması gerekir yapılan bakım hakkında b'ın kendi bağımlılıkları.

Burada ise libb.so bağımlılıklarını belirlemek için seni özledim etkileri bir örnek

$ export LD_LIBRARY_PATH=. # not needed if libs go to /usr/lib etc
$ g   -fpic -shared d.cpp -o libd.so
$ g   -fpic -shared b.cpp -o libb.so # wrong (but links)

$ g   -L. -lb a.cpp # wrong, as above
$ g   -Wl,--as-needed -L. -lb a.cpp # wrong, as above
$ g   a.cpp -L. -lb # wrong, misses libd.so
$ g   a.cpp -L. -ld -lb # wrong order (works on some distributions)
$ g   -Wl,--as-needed a.cpp -L. -ld -lb # wrong order (like static libs)
$ g   -Wl,--as-needed a.cpp -L. -lb -ld # "right"

Eğer şimdi bu ikili ne ise,* *22, olması gerektiği gibi libb kendini bağlı ikili unutmayın. Bu ikili eğer bu şekilde yaparsan eğer libb başka bir kütüphane bağlıdır eğer yeniden ayarlanması gerekir. Ve başkası libb zamanında dlopen kullanarak yükler (eklentileri dinamik olarak yükleme düşünün), çağrı, siz de başarısız olur. "right" gerçekten wrong bir yanı olmalı.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BASS212M

    BASS212M

    15 Temmuz 2009
  • Doug Bernards

    Doug Bernard

    7 Kasım 2007
  • 10 Daughters, 2 Sons

    10 Daughters

    10 Mart 2009