1

很抱歉问了这样一个初学者问题,但我对 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 的建议编辑的部分:
根据 Roger Rowland 所说,我将项目的 Character Set 属性更改为 Not Set。上面提到的两个错误得到了解决,但是这些错误上升了。
错误 LNK1120:1 未解析的外部
错误 LNK2019:未解析的外部符号 cvReleaseImage 在函数 main 中引用

我该如何解决这个问题?

4

2 回答 2

5

您的项目配置为 Unicode,这意味着_TCHAR宏的计算结果为wchar_t,这是 Windows 上的 16 位 UTF-16 数据类型。但是您调用的库接受 8 位char数据。

因此,您需要使界面的两侧匹配。有很多方法可以做到这一点。显而易见的选择是:

  1. 将您的项目更改为以 ANSI 为目标(在 VS 项目配置中将字符集更改为多字节)。
  2. 在调用库之前将输入参数从 UTF-16 转换为 ANSI。

在我看来,_TCHAR这些天使用起来不必要地复杂。当我们需要从单个代码库支持 Win9x(不支持 Unicode)和 WinNT(支持 Unicode)时,这很有用。但是我希望现在您的目标是基于 NT 的系统,因此您可以放心地假设支持 Unicode。在这种情况下,您可以使用wchar_twstring

另一方面,也许这只是一个供您个人使用的简单程序。在这种情况下,由于您的库需要 8 位字符,因此以 ANSI 为目标可能是最简单的。

但无论哪种方式,我都怀疑_TCHAR这只会让你感到困惑。如果我是你,我会放弃它。

最后一点是您提到您的目标是 x64,因为您的系统是 64 位的。请注意,64 位系统可以很好地运行 32 位代码。如果您希望您的程序能够在 32 位系统上运行,并且您没有迫切需要在 64 位下运行,那么以 x86 为目标可能更容易。


您对该问题的编辑提出了一个单独的问题,尽管我有所保留,我仍将尝试回答。

解析的外部符号错误表明链接器无法解析该特定符号。为了让链接器解析它,它需要传递定义该符号的 .lib 文件。您应该仔细检查您是否已在附加依赖项中包含所有必需的 .lib 文件。据我所知,OpenCV 有多个 .lib 文件,您可能缺少定义 .lib 的文件cvReleaseImage

于 2013-07-06T09:40:16.973 回答
0

就我而言,我包含了两次头文件。

我将我的库修改为:

#ifndef MY_LIB
#define MY_LIB

// code

#endif
于 2020-09-30T20:56:00.413 回答