IntelliSense:类型“_TCHAR *”的参数与“const char *”类型的参数不兼容

时间:2013-07-06 07:18:02

标签: visual-studio-2010 opencv image-processing char type-conversion

很抱歉提出这样一个初学者的问题,但我对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

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

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

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

  1. 将项目更改为目标ANSI(在VS项目配置中将字符集更改为多字节)。
  2. 在调用库之前,将输入参数从UTF-16转换为ANSI。
  3. 在我看来,这些日子使用_TCHAR是不必要的复杂。当我们需要从单个代码库支持Win9x(无Unicode支持)和WinNT(支持Unicode)时,这非常有用。但我希望现在你的目标是基于NT的系统,所以你可以安全地假设支持Unicode。在这种情况下,您可以使用wchar_twstring等。

    另一方面,也许这只是一个供您个人使用的简单程序。在这种情况下,由于您的库需要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