首页 文章

目标文件中未解析的外部符号

提问于
浏览
156

在Visual Studio中编码期间,我得到了一个未解决的外部符号错误,我不知道该怎么做 . 我不知道出了什么问题 . 你能破译我吗?我应该在哪里寻找什么样的错误?

1>Form.obj : error LNK2019: unresolved external symbol "public: class Field * __thiscall Field::addField(class Field *)" (?addField@Field@@QAEPAV1@PAV1@@Z) referenced in function "public: void __thiscall Form::parse(class std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> > &)" (?parse@Form@@QAEXAAV?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
1>Form.obj : error LNK2019: unresolved external symbol "public: virtual void __thiscall Field::parse(class std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> > &)" (?parse@Field@@UAEXAAV?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function "public: __thiscall InputField::InputField(class std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> > &)" (??0InputField@@QAE@AAV?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall Field::prompt(void)" (?prompt@Field@@UAEXXZ)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall Field::getName(void)" (?getName@Field@@UAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall Field::getType(void)" (?getType@Field@@UAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall Field::describe(void)" (?describe@Field@@UAEXXZ)
1>C:\Users\tomy\Documents\Visual Studio 2010\Projects\zapoctovkac++\Debug\zapoctovkac++.exe : fatal error LNK1120: 6 unresolved externals

22 回答

  • 0

    我有相同的链接错误,但来自一个引用另一个DLL的测试项目 . 发现在错误消息中指定的每个函数前添加 _declspec(dllexport) 后,链接运行良好 .

  • 0

    检查您是否包含您正在引用的解决方案中的所有源文件 .

    如果您未在项目中包含类 Field 的源文件(以及实现),则不会构建它,并且在编译期间您将无法链接 .

    或者,也许您正在使用静态或动态库,并忘记告诉链接器 .lib

  • 1

    确保您没有尝试将插入或提取操作符重载为内联函数 . 我有这个问题,当我删除该关键字时它才消失 .

  • 1

    刚花了几个小时才发现问题是我的主文件有扩展 .c 而不是 .cpp

    :/

  • 1

    我相信有关原因和补救措施的大多数要点都已包含在本主题中的所有贡献者中 . 我只是想指出我的“未解决的外部”问题,它是由定义为宏的数据类型导致的替换方式与预期不同,这导致错误的类型被提供给有问题的函数,并且因为函数类型永远不会被定义,它无法解决 . 特别是在C / C - > Language下,有一个名为'Treat WChar_t As Built in Type的属性,它应该被定义为'No(/ Zc:wchar_t-)'但在我的情况下不是 .

  • 1

    此链接器错误的一个可能原因也可能是声明但未在头文件中定义的 inline 函数,然后将其包含在其他位置 . 必须在使用它们的每个翻译单元中定义内联函数 .

  • 2

    我的问题是:我必须做 forward declaration 这个ctor为"unresolved external"的 class .

    在我收到错误的文件中,我不得不放这样的东西:

    #include "ClassB" 
    
    class ClassB; // this solved the problem
    
    class ClassA{
        void foo(){
            ClassB* tmp = new ClassB();
            // ...
        }
    };
    

    当然,我的项目要复杂得多,这只是一个片段示例 . 使用名称空间时,declare them as well .

  • 0

    确保用你的头文件装饰

    #ifndef YOUR_HEADER_H
    #define YOUR_HEADER_H
    
    // your header code here
    
    #endif
    

    如果你不这样做,可能会发生坏事 - 包括这个

  • 276

    它看起来缺少一个库或包含,您可以尝试找出具有getName,getType等的库的类,并将其放在头文件中或使用 #include .

    此外,如果这些恰好来自外部库,请确保在项目文件中引用它们 . 例如,如果此类属于abc.lib,则在Visual Studio中

    • 单击“项目属性” .

    • 转到配置属性,C / C,生成,验证您是否指向其他包含目录下的abc.lib位置 . 在Linker,Input下,确保在Additional Dependencies下有abc.lib .

  • 23

    还有一个可能的问题(我只是在一段时间内摸不着头脑):

    如果您将函数定义为 inline ,它们当然是! - 要在 Headers (或内联文件)中定义,而不是在cpp中定义 .
    就我而言,它们位于内联文件中,但仅仅因为它们是特定于平台的实现,并且 cpp 包含了相应的inl文件...而不是 Headers . 是的,不会发生 .

    我以为我也会把它留在这里,或许其他人遇到同样的问题并在这里找到它 .

  • 11

    我刚刚看到了一个问题,我无法在.cpp文件中调用main函数,在.h文件中正确声明并在.c文件中定义 . 遇到链接器错误 . 同时我可以从通常的.c文件中调用函数 . 可能这取决于电话 Session . 解决方案是在每个.h文件中添加以下预处理行:

    #ifdef __cplusplus
    extern "C"
    {
    #endif
    

    最后这些

    #ifdef __cplusplus
    }
    #endif
    
  • 2

    请参阅MSDN上的Linker Tools Error LNK2019,它有一个导致LNK2019的常见问题的详细列表 .

  • 4

    还有另一种检查的可能性,这次是我的问题 .

    我已将该函数添加到库中,并在搜索路径中包含库的输出文件夹 .

    但我还有一个文件夹,其中包含之前列出的旧版本库,因此VS使用的是旧库,当然也没有找到新功能 .

  • 2

    此错误通常意味着某些函数具有声明,但不具有定义 .

    例:

    // A.hpp
    class A
    {
    public:
      void myFunc(); // Function declaration
    };
    
    // A.cpp
    
    // Function definition
    void A::myFunc()
    {
      // do stuff
    }
    

    In your case, the definition cannot be found. 问题可能是你要包含一个头文件,它引入了一些函数声明,但你要么:

    • 不定义cpp文件中的函数(如果你自己编写了这段代码)

    • 不包含包含定义的lib / dll文件

    一个常见的错误是您将一个函数定义为独立函数并忘记了类选择器,例如 A:: ,在.cpp文件中:

    Wrong: void myFunc() { /* do stuff */ }
    Right: void A::myFunc() { /* do stuff */ }

  • 0

    我只是很难过 . 一切都在逻辑上设置 . 我声明了一个构造函数,但没有定义它

    class SomeClass
    {
       SomeClass();  // needs the SomeClass::SomeClass(){} function defined somewhere, even here
    }
    

    当我忘记一些如此基本的东西时,我差点撞到我的键盘上 .

  • 2

    我在很长一段时间内第一次做了一些C,当我忘记为函数定义添加ClassName ::前缀时,我收到了这个错误,因为这对C来说有点独特 . 所以记得要检查一下!

  • 0

    我的项目编译为 x64 项目时出错 . 我使用了编译为 x86Library .

    我已经将库重新编译为x64并且它解决了它 .

  • 6

    除了克里斯莫里斯上面的优秀答案之外,我发现了一种非常有趣的方法,如果你调用一个尚未设置为纯粹但没有自己的实现的虚方法,你可以收到同样的错误 . 这是完全相同的原因(编译器找不到该方法的实现,因此无法找到),但我的IDE并没有在最小的位置上发现这个错误 .

    例如,以下代码将获得具有相同错误消息的编译错误:

    //code testing an interface
    class test
    {
       void myFunc(); 
    }
    
    //define an interface
    class IamInterface
    {
        virtual void myFunc();
    }
    
    //implementation of the interface
    class IamConcreteImpl
    {
        void myFunc()
        {
           1+1=2;
        }
    }
    

    但是,将IamInterface myFunc()更改为纯虚方法(必须实现的方法),而不是作为“可以”覆盖的方法的虚方法)将消除编译错误 .

    //define an interface
    class IamInterface
    {
        virtual void myFunc() = 0;
    }
    

    希望这有助于下一个StackOverFlow人员逐步执行代码!

  • 0

    是什么导致了我的情况:

    我有一个巨大的文件 Foo.cpp 没有Foo.h. Foo.cpp 开头是这样的:

    // ... 100 LOC here ...
    namespace NS {
    // ... 100 more LOC here ...
    static int var;
    

    我删除了"static"关键字并添加了一个 Foo.h

    extern int var;
    

    你看错了吗?

    我完全错过了var最初是在命名空间中定义的,因为命名空间声明隐藏在其他代码中 . 修复是这样改变extern:

    namespace NS {
         extern int var;
    }
    
  • 0

    POINTERS

    我有这个问题,并通过使用指针解决它 . 我发现这不是你的问题,但我想我会提到它,因为我确实希望它在一小时前看到这里时就已经存在了 . 我的问题是在没有定义静态成员变量的情况下声明它(在其他一些设置之后需要定义),当然指针不需要定义 . 同样基本的错误:P

  • 3

    有时如果添加了新的头文件,并且由于这个错误而开始出现此错误,则还需要添加库以摆脱 unresolved external symbol .

    例如:

    #include WtsApi32.h
    

    需要:

    #pragma comment(lib, "Wtsapi32.lib")
    
  • 0

    我的问题是一个sconscript没有定义 cpp 文件 . 这可能非常令人困惑,因为Visual Studio在项目中有 cpp 文件,但完全正在构建其他东西 .

相关问题