SORU
7 Temmuz 2009, Salı


GCC C Linker hata: Tanımsız referans 'XXX için taban', 'Code için başvurusu geçersiz::Code()'

C projesi, 64, Eclipse-CDT kullanarak Ubuntu kuruyorum. Temelde Merhaba Dünya ve Türkiye 3. parti bir kütüphane bağlantı yapıyorum.

Başlık dosyaları, kütüphaneler için bağlantılı ekledim ama hala linker hataları alıyorum. Bazı olası sorunları burada görünenden başka (örneğin, doğru kütüphaneye bağlanıyorum 99% eminim) vardır.

  1. Bir 64-bit bağlantı duyuyorum statik kitaplıkları onaylamak için var mı?
  2. Bir şekilde kütüphane olmasını bekliyorum sınıfı (ve yöntem) olduğunu doğrulayın.

Eclipse " der

Building target: LinkProblem
Invoking: GCC C   Linker
g   -L/home/notroot/workspace/somelib-3/somelib/target/bin -o"LinkProblem"  ./src/LinkProblem.o   -lsomelib1 -lpthread -lsomelib2 -lsomelib3
./src/LinkProblem.o: In function `main':
/home/notroot/workspace/LinkProblem/Debug/../src/LinkProblem.cpp:17: undefined reference to `SomeClass::close()'
./src/LinkProblem.o: In function `SomeOtherClass':
/home/notroot/workspace/somelib-3/somelib/include/sql/somefile.h:148: undefined reference to `SomeClass::SomeClass()'
/home/notroot/workspace/somelib-3/somelib/include/sql/somefile.h:148: undefined reference to `vtable for SomeOtherClass'
/home/notroot/workspace/somelib-3/somelib/include/sql/somefile.h:151: undefined reference to `SomeClass::~SomeClass()'
./src/LinkProblem.o: In function `~SomeOtherClass':
/home/notroot/workspace/somelib-3/somelib/include/sql/somefile.h:140: undefined reference to `vtable for SomeOtherClass'
/home/notroot/workspace/somelib-3/somelib/include/sql/somefile.h:140: undefined reference to `SomeClass::~SomeClass()'
/home/notroot/workspace/somelib-3/somelib/include/sql/somefile.h:140: undefined reference to `SomeClass::~SomeClass()'
collect2: ld returned 1 exit status
make: *** [LinkProblem] Error 1

CEVAP
7 Temmuz 2009, Salı


Bu yöntemleri libs biri olduğunuzu varsayarak sipariş bir sorun gibi görünüyor.

Sırayla yapılır çalıştırılabilir kütüphaneler bağlarken olarak ilan edilmiştir.
Ayrıca linker sadece fonksiyonları şu anda Muallak bağımlılıkları gidermek için gerekli/yöntemleri alacak. Eğer daha sonraki bir kütüphane sonra, aslında nesneleri gerekli olmayan işlevleri/yöntemleri kullanıyorsa bağımlılık sorunları.

Nasıl çalışır:

  • Tüm nesne dosyaları ve çalıştırılabilir bir dosya içine bunları birleştirmek
  • Nesne dosyaları arasında herhangi bir dependecies gidermek.
  • Sırayla dosyalarda grup kütüphane:
    • Çözümlenemeyen bağımlılıkları kontrol edin ve eğer lib onları çözerse bakın.
    • Eğer çok yük dosyaya gerekli.

Örnek:

Nesneleri gerektirir:

  • Açın
  • Yakın
  • BatchRead
  • BatchWrite

Lib 1 sağlar:

  • Açın
  • Yakın
  • okuyun
  • yazın

Lib 2 sağlar

  • BatchRead (ama kullanır lib1:okumak)
  • BatchWrite (ama kullanır lib1:yazmak)

Eğer böyle bağlı:

-o plop plop gcc.o-l1-l2

Daha sonra linker okumak çözmek ve sembolleri yazmak için başarısız olur.

Ama eğer böyle bir uygulama ben etmeniz gerekir:

-o plop plop gcc.o-R2 -R1

O zaman doğru bağlantı. Olarak l2 giderir BatchRead ve BatchWrite bağımlılıklar aynı zamanda iki yenilerini ekler (okuma ve yazma). L1 ile bağlantı dört bağımlılıkları çözülmüş bir sonraki zaman.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • David MeShow

    David MeShow

    10 EKİM 2006
  • hotstrikegently

    hotstrikegen

    26 AĞUSTOS 2011
  • Kassem G

    Kassem G

    25 EKİM 2006