c++ - 在不同项目中使用 header 时出现 LINK2001 错误

标签 c++ visual-studio linker projects

我在 C++ 和 VS 方面经验不足,我不知道自己做错了什么,更重要的是如何解决它。

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

tlibdecoder.lib(TDecCu.obj) : error LNK2001: unresolved external symbol "public: void __thiscall CURegister::registerCU(int,int,int)" (?registerCU@CURegister@@QAEXHHH@Z)

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

在 CURegister.cpp 之上,我包含了 CURegister.h,因此定义了函数(我可以通过导入 CURegister.h 在同一项目中正常使用它),但是当我将 header 包含到 TDecCu.cpp 中时(通过添加#include "CURegister.h"in the top) 似乎有问题。

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

提前致谢。 B

最佳答案

“未解析的符号错误”是链接器 错误,与编译器 错误相对。链接是 Visual Studio 等 IDE 中看似单个“构建”事件的第二阶段。

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

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

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

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

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

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

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

关于c++ - 在不同项目中使用 header 时出现 LINK2001 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11666047/

相关文章:

c++ - 延迟着色 OpenGL 实现

c++ - 仅对项目文件启用 Visual Studio 的 C++ Core Check 分析?

c++ - 打开文件没有警告提示

使用 CI 构建的 C# 项目 - 对 Oracle 扩展的引用导致构建错误

c - ARM: GNU GCC LInker bss 部分对齐

ios - 仅链接设备上的第三方框架

c++ - 无法在 VC++ 中从 NASM 调用 c 函数,除了 main,出现链接错误

c++ - GDB 和 GCC 联盟

c++ - 为什么我的带有数组参数的方法不能正常工作? (C++)

c++ - 反转数字的子序列