0

我正在创建一个人脸识别程序,但我有一些错误,我不知道如何解决它......

Mat im = data.get_image(i,0); if(im.empty())continue; //Unresolved external symbol
vector<Point2f> p = data.get_points(i,false); int n = p.size(); //Unresolved external symbol

这是我得到的错误

Error   3   error LNK2019: unresolved external symbol "public: class cv::Mat __thiscall ft_data::get_image(int,int)" (?get_image@ft_data@@QAE?AVMat@cv@@HH@Z) referenced in function "public: void __thiscall face_detector::train(class ft_data &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class cv::Mat const &,bool,bool,float,float,int,class cv::Size_<int>)" (?train@face_detector@@QAEXAAVft_data@@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ABVMat@cv@@_N3MMHV?$Size_@H@6@@Z)    D:\Workshop\Final\C++ Console Application\AAM-Raw\AAM-Raw\AAM-Raw.obj   AAM-Raw
Error   4   error LNK2019: unresolved external symbol "public: class std::vector<class cv::Point_<float>,class std::allocator<class cv::Point_<float> > > __thiscall ft_data::get_points(int,bool)" (?get_points@ft_data@@QAE?AV?$vector@V?$Point_@M@cv@@V?$allocator@V?$Point_@M@cv@@@std@@@std@@H_N@Z) referenced in function "public: void __thiscall face_detector::train(class ft_data &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class cv::Mat const &,bool,bool,float,float,int,class cv::Size_<int>)" (?train@face_detector@@QAEXAAVft_data@@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ABVMat@cv@@_N3MMHV?$Size_@H@6@@Z) D:\Workshop\Final\C++ Console Application\AAM-Raw\AAM-Raw\AAM-Raw.obj   AAM-Raw

在我放之前它没有显示错误#include <GL/glext.h>,我需要那个标题来声明一个变量

我正在使用 Visual Studio 2012 和 c++ 控制台应用程序

4

2 回答 2

0

您的问题可能是这些问题中的任何一个。请努力寻找相关问题并着手解决。我没有您的完整代码,这就是为什么我无法判断哪个是问题所在。

我猜你的问题是因为train你的源代码中的函数而发生的。我更喜欢你在那段代码中寻找以下问题。很可能,您有全局常量问题,但也可能缺少函数体或变量。

全局常量

C++ 全局常量具有静态链接。这与 C 不同。如果您尝试在多个文件中使用 C++ 中的全局常量,则会收到未解决的外部错误。编译器优化全局常量,不为变量保留空间。解决此错误的一种方法是将 const 初始化包含在头文件中,并在必要时将该头包含在 CPP 文件中,就像它是函数原型一样。另一种可能性是使变量成为非常数并在评估时使用常数参考。

缺少函数体或变量

仅使用函数原型,编译器可以继续运行而不会出错,但链接器无法解析对地址的调用,因为没有保留函数代码或变量空间。在您创建对链接器必须解析的函数的调用之前,您不会看到此错误。

自动(函数范围)变量

在函数中声明的变量只能在该函数的范围内使用。

函数内联问题

如果您使用函数内联,则必须:

  • 在包含的头文件中实现内联函数。

  • 在头文件中打开内联。

如果您使用#pragma inline_depth 编译器指令,请确保您的值设置为2 或更大。零值将关闭内联。还要确保您使用的是 /Ob1 或 /Ob2 编译器选项。在不同的模块上混合内联和非内联编译选项有时会导致问题。如果创建 C++ 库时打开了函数内联(/Ob1 或 /Ob2),但描述函数的相应头文件已关闭内联(无选项),您将收到错误 LNK2001。这些函数不会从头文件内联到代码中,但由于它们不在库文件中,因此没有解析引用的地址。同样,使用函数内联但在 .cpp 文件而不是头文件中定义函数的项目也将获得 LNK2019。头文件包含在任何认为合适的地方,但只有在 .cpp 文件通过编译器时才内联函数;因此,在其他模块中使用时,链接器会将这些函数视为未解析的外部函数。

于 2013-07-23T08:29:40.020 回答
0

如果您使用的是 64 位版本的 OpenCV 库,或者使用 64 位配置编译 OpenCV,请不要忘记将视频工作室项目切换到 64 位。

尝试在 32 位项目中使用 64 位库时,Visual Studio 会给出未解决的外部错误,这确实令人困惑,因为您将包含正确的库.. 至少按名称。

于 2015-07-06T23:30:12.153 回答