VS 2008中的奇怪链接错误

时间:2012-11-03 18:59:18

标签: c++ visual-c++ opencv

我正在编译下面的代码片段

cv::Mat frame ;
tld->processImage(frame);

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”的其他方法。

感谢任何帮助。

谢谢

2 个答案:

答案 0 :(得分:0)

C++有两个阶段将您的代码转换为执行代码,第一个是编译,第二个是链接。在第一阶段编译器中查找代码语法,在此阶段,它理解您有一个名为processImage的函数,它接受一个cv::Mat类型的参数,但在第二阶段链接器中寻找它的实现,但不能找到它,你实现了该方法还是只是声明它?如果答案是肯定的,你是否在链接过程中包含了包含你的实现的源(.cpp)文件?如果函数来自外部库,您是否将该库包含在传递给链接器的库列表中?通过回答这些问题,我确信你总能解决链接器的unresolved external symbol错误:)

答案 1 :(得分:0)

我认为您很可能错过cv::Mat的引用。如果TLD课程在其他地方工作,那几乎可以肯定,因为您在进行此方法调用的地方没有cv的包含。

如果cv有多个包含,则应添加到头文件的顶部;

#ifndef CV
#define CV

在文件底部添加;

#endif

这将确保文件只编译一次,并且在我经常编写c ++时用于解决很多链接器问题。