【问题标题】:LINK2001 error while using headers in different projects在不同项目中使用标头时出现 LINK2001 错误
【发布时间】:2012-07-26 09:14:31
【问题描述】:

我在 C++ 和 VS 方面经验不足,我无法弄清楚我做错了什么,更重要的是如何解决它。

我正在研究一个包含多个项目的解决方案,现在我开始在另一个项目中使用一个项目中的类。但是,我收到了这个错误:

tlibdecoder.lib(TDecCu.obj):错误 LNK2001:未解析的外部 符号“公共:无效 __thiscall CURegister::registerCU(int,int,int)” (?registerCU@CURegister@@QAEXHHH@Z)

问题似乎是我在 TDecCu.cpp 中使用的函数,它来自文件 CURegister.h 和 CURegister.cpp。

在 CURegister.cpp 的顶部,我包含了 CURegister.h,因此定义了函数(我可以通过导入 CURegister.h 在同一个项目中正常使用它),但是当我将标头包含到 TDecCu.cpp 中时(通过添加#include "CURegister.h" in top) 好像有问题。

谁能告诉我如何解决这个问题?请记住,我没有经验,所以不要介意解释得很简单;)

提前致谢。 乙

【问题讨论】:

    标签: c++ visual-studio linker projects


    【解决方案1】:

    “未解决的符号错误”是链接器错误,而不是编译器错误。链接是在像 Visual Studio 这样的 IDE 中似乎是单个“构建”事件的第二阶段。

    这里的核心问题涉及the distinction between declarations and definitions in C++。简而言之,声明向编译器引入了一个符号(如函数),而定义提供了该符号的实际实例化/实现链接器。在考虑函数时,定义就是您可能听说过的原型。像这样的:

    void registerCu(int x, int y, int depth);
    

    注意它没有提供函数的实现,所以它只是一个定义。这与提供完整实现的声明不同:

    void registerCu(int x, int y, int depth)
    {
        // do magic stuff here  
    }
    

    如果这是一个独立的独立项目,您可以假设链接器错误提醒您未能提供函数的定义。这可能意味着您在某处的标头中编写了原型,但实际上并未将函数的内容写入相应的 .cpp 文件中。

    但是由于您的 cmets 对 infact 的回答表明您确实在 .cpp 文件中提供了实现,并且问题表明您正在处理多个项目,因此 第二个 更有可能项目找不到函数定义。您已经包含了第一个项目的标头,它为第二个项目提供了声明,因此编译器很高兴。但是当链接器开始实际尝试链接该函数调用的目标代码时,它会因为找不到定义而感到失望。

    通过指示第二个项目的链接器在第一个项目的目标代码中查找它找不到的任何定义来解决此问题。您通常通过将包含第一个项目的构建输出的文件夹的路径添加到第二个项目的链接器设置来执行此操作。

    【讨论】:

    • 正如您所说,必须指示链接器在另一个项目的输出路径中查找目标代码。谢谢!
    【解决方案2】:

    您应该将 CURegister.h 和 CURegister.cpp 添加到 TDecCu.cpp 所在的项目中。

    .h 只包含声明,.cpp 包含实现,当一个项目被编译时,编译器会尝试从项目文件或项目引用的一些 lib 文件中找到所有需要的实现。

    如果您只是在文件中包含 .h,编译器将无法找到其实现。

    【讨论】:

    • 这完全符合头文件的目的,不是吗?无论如何我都修复了它:链接器没有在正确的目录中查找。
    猜你喜欢
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    • 2018-09-07
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多