很抱歉提出这样一个初学者的问题,但我对openCV和VC ++ 2010真的很陌生。我在网上搜索了一个答案,但我找不到合适的答案。
构建OReilly-LearningOpenCV书籍的第一个项目“First Program-Display a Picture”,我遇到了这些错误:
1-error C2664: 'cvLoadImage' : cannot convert parameter 1 from '_TCHAR *' to 'const char *'
2-IntelliSense: argument of type "_TCHAR *" is incompatible with parameter of type "const char *"
这是代码:
#include "stdafx.h"
#include "opencv\highgui.h"
int _tmain(int argc, _TCHAR* argv[])
{ IplImage* img = cvLoadImage( argv[1] );
cvNamedWindow( "Example1", CV_WINDOW_AUTOSIZE );
cvShowImage( "Example1", img );
cvWaitKey(0);
cvReleaseImage( &img );
cvDestroyWindow( "Example1" );
system("pause");
return 0;
}
这是我从Microsoft Visual Studio 2010获得的消息:
1>------ Build started: Project: FirstProgram_DisplayAPicture3, Configuration: Debug x64 ------
1>Build started 7/6/2013 11:13:00 AM.
1>InitializeBuildStatus:
1> Touching "x64\Debug\FirstProgram_DisplayAPicture3.unsuccessfulbuild".
1>ClCompile:
1> All outputs are up-to-date.
1> FirstProgram_DisplayAPicture3.cpp
1>FirstProgram_DisplayAPicture3.cpp(9): error C2664: 'cvLoadImage' : cannot convert parameter 1 from '_TCHAR *' to 'const char *'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:00.68
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
可能需要的其他信息:
我已经创建了一个win32控制台应用程序,在向导的第二页中我选择了预编译的头文件设置
我已将项目平台更改为x64,因为我使用win7x64作为操作系统
我已经正确地将openCV库链接到我的项目
我刚刚介绍了highgui.lib作为附加依赖项
任何帮助将不胜感激 我该怎么做才能解决这两个错误?
编辑部分:
请注意,这些错误发生在第6行,我的意思是行IplImage * img = cvLoadImage(argv [1]);
我编辑的部分基于罗杰罗兰的建议:
根据Roger Rowland的说法,我将项目的Character Set属性更改为Not Set。上面提到的两个错误得到了解决,但这些错误上升了
错误LNK1120:1个未解析的外部因素
错误LNK2019:函数main中引用的未解析的外部符号cvReleaseImage
我该如何解决这个问题?
答案 0 :(得分:4)
您的项目配置为Unicode,这意味着_TCHAR
宏评估为wchar_t
,这是Windows上的16位UTF-16数据类型。但是您调用的库接受8位char
数据。
因此,您需要使界面的两侧都匹配。有很多方法可以做到这一点。显而易见的选择是:
在我看来,这些日子使用_TCHAR
是不必要的复杂。当我们需要从单个代码库支持Win9x(无Unicode支持)和WinNT(支持Unicode)时,这非常有用。但我希望现在你的目标是基于NT的系统,所以你可以安全地假设支持Unicode。在这种情况下,您可以使用wchar_t
,wstring
等。
另一方面,也许这只是一个供您个人使用的简单程序。在这种情况下,由于您的库需要8位字符,因此最简单的目标是ANSI。
但无论哪种方式,我都怀疑_TCHAR
会让你感到困惑。如果我是你,我会放弃它。
最后一点是,您提到您的目标是x64,因为您的系统是64位。请注意,64位系统可以很好地运行32位代码。如果您希望您的程序能够在32位系统上运行,并且您没有迫切需要在64位下运行,那么定位x86可能更容易。
您对该问题的编辑会提出一个单独的问题,尽管我有所保留,我仍会尝试回答。
未解析的外部符号错误表示链接器无法解析该特定符号。为了让链接器解析它,需要传递定义该符号的.lib文件。您应该仔细检查是否已在其他依赖项中包含所有必需的.lib文件。从我可以收集的内容来看,OpenCV有多个.lib文件,你可能错过了定义cvReleaseImage
的文件。
答案 1 :(得分:0)
就我而言,我两次包含了头文件。
我将自己的库修改为:
#ifndef MY_LIB
#define MY_LIB
// code
#endif