【问题标题】:IntelliSense: argument of type "_TCHAR *" is incompatible with parameter of type "const char *"IntelliSense:“_TCHAR *”类型的参数与“const char *”类型的参数不兼容
【发布时间】:2013-07-04 06:05:57
【问题描述】:

很抱歉提出这样一个初学者问题,但我对 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:函数 main 中引用的未解析的外部符号 cvReleaseImage

我该如何解决这个问题?

【问题讨论】:

  • 您的项目属性显然指定了 UNICODE,因此要么更改项目属性,要么修改您的代码以在带引号的字符串周围使用 _T 宏,例如cvShowImage(_T("Example1"), img );
  • 感谢@Roger Rowland,但我测试了您的建议并尝试在引用字符串周围使用 T。错误增加到 5 个数字。我的意思是除了第 6 行“IplImage* img = cvLoadImage(argv[1]);”产生了上面的两个错误,我们将有一个错误 IntelliSense: argument of type "const wchar_t *" is incompatible with parameter of type "const char *" 在每行有引号的字符串,我没有' t 理解您说 _enhance the project properties 的目的
  • 您需要在 T 前加一个下划线,或者使用 TEXT("string") 代替 _T("string")。如果做不到,请在 VS2010 解决方案资源管理器面板中右键单击您的项目,从菜单中选择 Properties,然后在 Configuration Properties/General 下找到它说 Character Set 并将其更改为 Not Set
  • @Roger Rowland using TEXT("string") 将产生错误 IntelliSense: identifier "TEXT" is undefined 并且粗略的我使用了 _T 而不仅仅是 T。这里有一种错字,但我还没有尝试更改项目属性,我现在就这样做。
  • @Roger Rowland 我尝试更改项目属性。它省略了提到的两个错误,但出现了另外两个错误。请查看“我根据 Roger Rowland 的建议编辑的部分”我会在一分钟内更新它。

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


【解决方案1】:

您的项目配置为 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 文件,您可能缺少定义 cvReleaseImage 的文件。

【讨论】:

  • 是的,我知道 VS 会引导您走上这条令人困惑的道路。我总是将其全部剥离并使用wchar_tchar。您将字符集更改为多字节。就是这样。
  • 不存在省略_TCHAR 的风险。要省略它,只需停止使用它!将字符集更改为多字节并将您的主要更改为:int main(int argc, char* argv[]),一切都很好。在不同字符编码之间进行转换的最佳方式是一个涉及的主题。没有一个简单的答案。我们不能在 cmets 中真正做到这一切。
  • 例如,您可能会使用此处描述的 ATL 宏:msdn.microsoft.com/en-us/library/87zae4a3(v=vs.110).aspx,这是一个不错的选择,但还有其他选择。这个问题有扩展到一个巨大的调试会话的危险。你已经得到了两个问题的价格! ;-)
  • 您需要添加缺少的 .lib 文件。这是你问的第二个问题。我在单杠下方回答了这个问题。 OpenCV 库带有多个 .lib 文件。您只添加了一个,highgui。你应该把它们都加进去。
  • ANSI 是 Windows 中用来指代 8 位字符集的术语。它是多字节字符集的同义词(在 Windows 中)。另一种选择是 UTF-16,在 Windows 世界中称为 Unicode。
【解决方案2】:

在我的例子中,我包含了两次头文件。

我将我的库修改为:

#ifndef MY_LIB
#define MY_LIB

// code

#endif

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 2016-05-19
    • 2020-01-20
    • 1970-01-01
    • 2021-08-06
    • 2020-11-19
    • 1970-01-01
    相关资源
    最近更新 更多