在不同项目中使用标头时发生LINK2001错误

LINK2001 error while using headers in different projects

本文关键字:错误 LINK2001 项目      更新时间:2023-10-16

我在C++和VS中没有经验,我不知道我做错了什么,更重要的是如何修复它。

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

tlibdecoder.lib(TDecCu.obj):错误LNK2001:未解析的外部symbol"public:void __thiscall CURegister::registerCU(int,int,int)"(?registerCU@CURegister@@QAEXHHH@Z)

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

在CURegister.cpp的顶部,我包含了CURegistr.h,所以函数是定义的(我可以通过jsut导入CURegiste.h在同一项目中正常使用它),但当我将标题包含到TDecCu.cpp中时(通过在顶部添加#include"CURegister.h"),似乎存在问题。

有人能告诉我怎么修吗?请记住,我没有经验,所以不介意解释得很简单;)

提前谢谢。B

"未解析符号错误"是链接器错误,而不是编译器的错误。链接是像VisualStudio这样的IDE中的单个"构建"事件的第二阶段。

这里的中心问题涉及C++中声明定义之间的区别。简而言之,声明编译器引入了一个符号(类似于函数),而定义链接器提供了该符号的实际实例化/实现。当考虑一个函数时,这个定义可能被称为原型。类似这样的东西:

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

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

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

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

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

通过指示第二个项目的链接器在第一个项目的对象代码中查找找不到的任何定义来解决此问题。通常,您可以将包含第一个项目的生成输出的文件夹的路径添加到第二个项目的链接器设置中。

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

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

若只在文件中包含.h,编译器就无法定位其实现。