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?
CEVAP
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].
- 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]
- 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]
- Kaynak dosya simgeleri (2.5) ve beyaz boşluk karakterleri (yorumlar da dahil) önişleme, ayrılmıştır.[KELEPİR]
- Ö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]
- 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]
- Bitişik dize belirteçleri birleştirilmiş.
- 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]
- Tercüme çeviri birimi ve örnekleme birimleri aşağıdaki gibi birleştirilir[KELEPİR]
- 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.cpp
ilan 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 LNK1120
MSVSve undefined reference to symbolName
gcc.
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:
- Failure to link against appropriate libraries/object files or compile implementation files
- Declared and undefined variable or function.
- Common issues with class-type members
- Template implementations not visible.
- Symbols were defined in a C program and used in C code.
- Incorrectly importing/exporting methods/classes accross modules. (MSVS specific)
- Circular library dependency
- undefined reference to `WinMain@16'
- Interdependent library order
- Multiple source files of the same name
- Mistyping or not including the .lib extension when using the
#pragma
(MSVC)
Bir NullReferenceException nedir ve na...
Bir yığın izleme, nedir ve nasıl uygul...
Nasıl PyDev "almak Tanımsız değiş...
Nasıl inşa hedefin dışında gcc hata ay...
LNK2019 hata: çözülmemiş bir dış simge...