SORU
24 EYLÜL 2012, PAZARTESİ


Tanımsız başvuru/çözülmemiş bir dış simge bir hata nedir ve nasıl düzeltebilirim?

Tanımsız başvuru çözülmemiş bir dış simge hataları nelerdir? Onları düzeltmek ve önlemek için nasıl ortak nedenleri nelerdir?

/Kendi düzenlemek için çekinmeyin.

CEVAP
24 EYLÜL 2012, PAZARTESİ


C bir program derleme belirtildiği gibi çeşitli adımlar, yer alır2.2(credits to Keith Thompson for the reference):

Çeviri sözdizimi kuralları arasında önceliği aşağıdaki aşamaları belirtilir[Dipnot].

  1. Fiziksel kaynak dosyası karakterleri, temel kaynak karakter kümesi için uygulama tanımlı bir şekilde, eşleştirilir (son satır göstergeler için yeni satır karakterleri tanıtma) gerekli.[KELEPİR]
  2. Bir ters eğik çizgi karakteri (\) hemen yeni satır karakteri tarafından izlenen her örneği, fiziksel kaynağı hatları için yapıştırma silinir mantıksal kaynak hatları oluşturur.[KELEPİR]
  3. Kaynak dosya simgeleri (2.5) ve beyaz boşluk karakterleri (yorumlar da dahil) önişleme, ayrılmıştır.[KELEPİR]
  4. Önişleme direktifleri yürütülür, makro çağırmaları genişletilir ve _Pragma tekli operatör ifadeler yürütülür.[KELEPİR]
  5. Her kaynak bir karakter hazır bilgi ya da bir dize üyesi olarak çıkış sırası ve evrensel karakter adı her set bir karakterin harf veya olmayan ham bir dize olarak dönüştürülür yürütme karaktere karşılık gelen elemanı ayarlayın;[KELEPİR]
  6. Bitişik dize belirteçleri birleştirilmiş.
  7. Beyaz boşluk karakterleri simgeleri ayırmak artık önemli. Her belirteç önişleme bir simge haline dönüşür. (2.7). Bu belirteçleri sözdizimsel olarak ortaya çıkan ve anlamsal analiz ve çeviri bir birim olarak çevrilmiş.[KELEPİR]
  8. Tercüme çeviri birimi ve örnekleme birimleri aşağıdaki gibi birleştirilir[KELEPİR]
  9. Tüm dış varlık başvuruları çözümlenir. Kütüphane bileşenleri varlıklar için dış başvurular tanımlanmamış tatmin bağlı güncel çeviri. Tüm bu çevirmen çıktı alınır onun içinde yürütülmesi için gerekli bilgileri içeren program görüntü çalışma ortamı.(vurgu benim)

[Dipnot]Uygulamaları uygulama farklı aşamalarında birlikte katlanmış olabilir, ancak bu aşamada ortaya gibi davranması gerekir.

Belirtilen hatalar derleme bu son aşamada, en yaygın bağlantı olarak oluşur. Temelde nesne dosyaları veya kitaplıkları içine uygulama dosyaları bir sürü derlenmiş ve şimdi beraber çalışabilmemiz için istediğiniz anlamına gelir.

a.cpp sembol a tanımlanan söylüyorlar. Şimdi, b.cppilan ettibu sembolü kullandı. Bağlama önce, sadece bu sembol tanımlanmış olduğunu varsayarbir yereHenüz nerede olduğu önemli değil , ama. Bağlama aşaması b.cpp sembol bulma ve doğru bir şekilde bağlayan sorumlu (bunu kullanan bir nesne ya da kütüphane için aslında).

Eğer MSVS kullanıyorsanız, bu projeleri .lib dosyalarını oluşturmak göreceksiniz. Bu semboller ihraç ve ithal sembolleri bir tablo bir tablo içerir. İçe aktarılan semboller karşı bağlantı kitaplıkları karşı çözülür, ve verilen semboller .lib (varsa) kullanan kütüphaneler için verilmiştir.

Benzer mekanizma diğer Derleyiciler için/platformlar var.

Genel hata iletileri için error LNK2001, error LNK1120MSVSve undefined reference to symbolNamegcc.

Kod:

struct X
{
   virtual void foo();
};
struct Y : X
{
   void foo() {}
};
struct A
{
   virtual ~A() = 0;
};
struct B: A
{
   virtual ~B(){}
};
extern int x;
void foo();
int main()
{
   x = 0;
   foo();
   Y y;
   B b;
}

aşağıdaki hatalara sahipgcc:

/home/AbiSfw/ccvvuHoX.o: In function `main':
prog.cpp:(.text 0x10): undefined reference to `x'
prog.cpp:(.text 0x19): undefined reference to `foo()'
prog.cpp:(.text 0x2d): undefined reference to `A::~A()'
/home/AbiSfw/ccvvuHoX.o: In function `B::~B()':
prog.cpp:(.text._ZN1BD1Ev[B::~B()] 0xb): undefined reference to `A::~A()'
/home/AbiSfw/ccvvuHoX.o: In function `B::~B()':
prog.cpp:(.text._ZN1BD0Ev[B::~B()] 0x12): undefined reference to `A::~A()'
/home/AbiSfw/ccvvuHoX.o:(.rodata._ZTI1Y[typeinfo for Y] 0x8): undefined reference to `typeinfo for X'
/home/AbiSfw/ccvvuHoX.o:(.rodata._ZTI1B[typeinfo for B] 0x8): undefined reference to `typeinfo for A'
collect2: ld returned 1 exit status

ve benzer hataları ileMSVS:

1>test2.obj : error LNK2001: unresolved external symbol "void __cdecl foo(void)" (?foo@@YAXXZ)
1>test2.obj : error LNK2001: unresolved external symbol "int x" (?x@@3HA)
1>test2.obj : error LNK2001: unresolved external symbol "public: virtual __thiscall A::~A(void)" (??1A@@UAE@XZ)
1>test2.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall X::foo(void)" (?foo@X@@UAEXXZ)
1>...\test2.exe : fatal error LNK1120: 4 unresolved externals

Genel nedenleri şunlardır:

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AutoStream's Garage419

    AutoStream's

    15 EKİM 2007
  • mliskIT

    mliskIT

    29 Mart 2012
  • Peter Sharp

    Peter Sharp

    11 ŞUBAT 2013