什么是 undefined 的参考/未解决的外部符号错误?常见原因是什么?如何解决/预防它们?
随时编辑/添加自己的。
最佳答案
如 2.2 (credits to Keith Thompson for the reference)所指定,编译C++程序需要分几步进行:
指定的错误发生在编译的最后阶段,通常称为链接。基本上,这意味着您将一堆实现文件编译为目标文件或库,现在想让它们一起工作。
假设您在a
中定义了符号a.cpp
。现在,b.cpp
声明了该符号并使用了它。在链接之前,它只是假设该符号已在某处定义,但是它并不关心在哪里。链接阶段负责查找符号并将其正确链接到b.cpp
(实际上是使用该符号的对象或库)。
如果您使用的是Microsoft Visual Studio,则会看到项目会生成.lib
文件。它们包含一个导出符号表和一个导入符号表。将针对链接的库解析导入的符号,并为使用该.lib
(如果有)的库提供导出的符号。
其他编译器/平台也存在类似的机制。
常见错误消息是的error LNK2001
,error LNK1120
,error LNK2019
和Microsoft Visual Studio 的undefined reference to
和 GCC 的#pragma
symbolName。
代码:
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;
}
将使用 GCC 生成以下错误:/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
以及和Microsoft Visual Studio 的类似错误: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
常见原因包括:UNICODE
(Microsoft Visual Studio) 关于c++ - 什么是 undefined reference / Unresolved external symbol 错误,如何解决?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56073442/