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

x64 上的 WMI 链接器错误

Access 2007,VBA:将 BLOB 插入链接表时出现奇怪的错误

OPENCV 链接错误 - Win32 & VS2012

Microsoft HPC Pack 2008 SDK 的链接器错误