8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

什么是未定义的引用/未解析的外部符号错误以及如何修复它?

Muran 1月前

107 0

什么是未定义引用/未解析的外部符号错误?常见原因有哪些?如何修复和预防这些错误?

什么是未定义引用/未解析的外部符号错误?常见原因有哪些?如何修复和预防这些错误?

帖子版权声明 1、本帖标题:什么是未定义的引用/未解析的外部符号错误以及如何修复它?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Muran在本站《linux》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 假设你有以下代码:

    // a.cpp
    int get() { return 0; }
    
    // b.cpp
    int get(); // usually, one doesn't write this directly, but gets these
               // declarations from included header files
    int x = get();
    

    在编译时 b.cpp ,编译器只是假设 get() 在某处 定义 ,但它并不关心在哪里。链接阶段负责查找符号并正确链接从 a.cpp b.cpp .

    如果 a.cpp 没有定义 get ,您将收到一个链接器错误,提示“未定义的引用”或“未解析的外部符号”。

    C++ 标准措辞

    中指定的几个阶段进行 [lex.phases] ,其中最后一个阶段是相关的:

    9. 解析所有外部实体引用。链接库组件以满足对当前翻译中未定义的实体的外部引用。所有此类翻译器输出都被收集到程序映像中,该程序映像包含在其执行环境中执行所需的信息。

    请参阅 Keith Thompson 的回答 以了解这些阶段的摘要。

    指定的错误发生在编译的最后阶段,通常称为链接。这基本上意味着您将一堆源文件编译成目标文件或库,现在您想让它们一起工作。

    实践中的链接器错误

    如果您使用的是 Microsoft Visual Studio,则会看到项目生成 .lib 文件。这些文件包含一个导出符号表和一个导入符号表。导入的符号会根据您链接的库进行解析,导出的符号会提供给使用该符号的库 .lib (如果有)。

    其他编译器/平台也存在类似的机制。

    常见错误消息 error LNK2001 , error LNK1120 , error LNK2019 针对 Microsoft Visual Studio ,而 undefined reference to symbolName 针对 GCC .

    代码:

    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
    

    常见原因

    • 无法链接到适当的库/目标文件或编译实现文件
    • 已声明但未定义的变量或函数。
    • 类类型成员的常见问题
    • 模板实现不可见。
    • 符号在 C 程序中定义并在 C++ 代码中使用。
    • 跨模块/dll 错误地导入/导出方法/类。(特定于 MSVS)
    • 循环库依赖
    • 对“WinMain@16”的未定义引用
    • 相互依存的图书馆秩序
    • 多个同名的源文件
    • 使用 #pragma 时输入错误或未包含 .lib 扩展名 (Microsoft Visual Studio)
    • 模板朋友的问题
    • UNICODE 定义不一致
    • const 变量声明/定义中缺少 \'extern\'(仅限 C++)
    • Visual Studio Code 未配置为多文件项目
    • 在 Mac OS X 上构建 dylib 时出错,但在其他 Unix-y 系统上构建 .so 则正常
    • 你的链接在引用库的对象文件之前就使用了库
    • 您的链接包含来自不同 C++ 编译器的 C++ 目标文件和 C++ 库
返回
作者最近主题: