1

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

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

提前致谢。乙

4

2 回答 2

3

“未解决的符号错误”是链接器错误,而不是编译器错误。链接是在像 Visual Studio 这样的 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 文件中提供了实现,并且问题表明您正在处理多个项目,因此第二个项目更有可能无法找到函数定义。您已经包含了第一个项目的标头,它为第二个项目提供了声明,因此编译器很高兴。但是当链接器开始实际尝试链接该函数调用的目标代码时,它会因为找不到定义而感到失望。

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

于 2012-07-26T09:44:41.700 回答
0

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

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

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

于 2012-07-26T09:39:52.977 回答