VS 2008 中的奇怪链接错误
Posted
技术标签:
【中文标题】VS 2008 中的奇怪链接错误【英文标题】:Strange Linking error in VS 2008 【发布时间】:2012-11-03 18:59:17 【问题描述】:我正在编译下面的代码 sn-p
cv::Mat frame ;
tld->processImage(frame);
并出现以下链接器错误
错误 LNK2019:函数 _main 中引用的未解析外部符号“public: void __thiscall tld::TLD::processImage(class cv::Mat)”(?processImage@TLD@tld@@QAEXVMat@cv@@@Z)
现在我把代码改成了这样
Mat frame ;
tld->processImage(0);
并出现以下链接器错误
错误 C2664:“tld::TLD::processImage”:无法将参数 1 从“int”转换为“cv::Mat” 没有构造函数可以采用源类型,或者构造函数重载决议不明确
问题是当我调用 tld->processImage(frame) 方法时,我收到此链接器错误“未解析的符号”,但是当我以不正确的类型作为参数调用此方法时,它会给出另一个“无法转换参数”错误,从而确认事实上,方法是存在的。
这个问题只发生在 processImage() 方法中。 我可以毫无问题地调用“tld”的其他方法。
感谢任何帮助。
谢谢
【问题讨论】:
您的原始问题意味着您丢失了(链接时至少有一个 obj 文件)。新错误很明显,是编译器错误:你没有从 int 到 Mat 的转换... 您能发布更多有关您的 TLD 课程的信息吗? 【参考方案1】:我认为您很可能缺少cv::Mat
的引用。如果 TLD 类在其他地方工作,那几乎可以肯定是因为您在进行此方法调用的地方没有包含 cv
。
如果cv
有多个包含,则应添加到头文件的顶部;
#ifndef CV
#define CV
并在文件底部添加;
#endif
这将确保文件只编译一次,并且在我经常编写c++时为我解决了很多链接器问题。
【讨论】:
【参考方案2】:C++
有两个阶段将您的代码转换为执行代码,第一个是编译,第二个是链接。在第一阶段编译器寻找代码语法,在这个阶段它知道你有一个名为processImage
的函数,它接受一个cv::Mat
类型的参数,但在第二阶段链接器寻找它的实现并且找不到它,确实您实现该方法还是仅声明它?如果答案是肯定的,您是否在链接过程中包含了包含您的实现的源(.cpp
)文件?如果函数来自外部库,您是否将该库包含在传递给链接器的库列表中?通过回答这个问题,我相信您总能解决链接器的unresolved external symbol
错误:)
【讨论】:
非常感谢您净化空气!!!。这肯定会帮助我调试此类错误。感谢您节省了我很多时间:)以上是关于VS 2008 中的奇怪链接错误的主要内容,如果未能解决你的问题,请参考以下文章
vs 和sql server 2008 产生两个实例(SQLEXPRESS和MSSQLSERVER),在VS中手动链接时出现错误代号:26
VS2008 VC++/MFC 出错LNK2001与1120