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

时间:2012-07-26 09:14:32

标签: c++ visual-studio linker projects

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

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

  

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

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

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

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

提前致谢。 乙

2 个答案:

答案 0 :(得分:3)

“未解决的符号错误”是链接器错误,而不是编译器错误。链接是在像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文件中写入该函数的内容。

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

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

答案 1 :(得分:0)

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

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

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