在不同项目中使用标头时发生LINK2001错误
LINK2001 error while using headers in different projects
我在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,编译器就无法定位其实现。
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 在不同项目中使用标头时发生LINK2001错误