1

Извините, что задал такой вопрос для новичков, но я действительно новичок в openCV и VC++ 2010. Я искал в сети ответ, но у меня не получилось.IntelliSense: аргумент типа «_TCHAR *» несовместим с параметром типа «const char *»

Создание первого проекта "Первая программа-Display Картину" книги OReilly-LearningOpenCV, я столкнулся с этими ошибками:

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]);

Мой отредактирован раздел основан на предложение Роджера Роуланда:
Основываясь на том, что сказал Роджер Rowland, я изменил набор символов свойство проекта не указан. Две ошибки, упомянутые выше, были решены, но эти ошибки поднялись. LNK1120
ошибка: 1 неразрешенных внешних
ошибка LNK2019: неразрешенный внешний символ cvReleaseImage ссылка в функции главного

Как я могу решить эту проблему?

+0

Свойства вашего проекта, очевидно, указывают UNICODE, поэтому либо изменяйте свойства проекта, либо изменяйте свой код, чтобы использовать макрос '_T' вокруг цитируемых строк, например. 'cvShowImage (_T (" Example1 "), img);' –

+0

спасибо @Roger Rowland, но я протестировал ваше предложение и попытался использовать _T вокруг цитируемых строк. Ошибки увеличиваются до 5 чисел. Я имею в виду, кроме строки 6 «IplImage * img = cvLoadImage (argv [1]); который произвел две ошибки выше, мы будем иметь ошибку ** IntelliSense: аргумент типа «const wchar_t *» несовместим с параметром типа «const char *» ** в каждой строке, в которой указаны строки, и я не понял ваш цель сказать _хугот свойства проекта_ – sepideh

+0

Вам нужно подчеркнуть перед Т, или, альтернативно, использовать 'TEXT (« string »)' вместо '_T (« string »)'. Если вы не можете этого сделать, щелкните правой кнопкой мыши на своем проекте в панели анализатора решений VS2010, выберите «Свойства» в меню, затем в разделе «Свойства конфигурации/Общие» найдите, где он говорит * Набор символов *, и измените это на * Не задано*. –

ответ

3

Ваш проект настроен для Unicode, что означает, что макрос _TCHAR оценивается как wchar_t, который представляет собой 16-битный тип данных UTF-16 в Windows. Но библиотека, которую вы вызываете, принимает 8 бит char данных.

Итак, вам нужно будет согласовать обе стороны интерфейса. Много способов сделать это. Очевидными опциями являются:

  1. Измените свой проект на целевой ANSI (измените набор символов на мультибайт в конфигурации проекта VS).
  2. Перед вызовом библиотеки преобразуйте входной аргумент из UTF-16 в ANSI.

В настоящее время, как представляется, излишне сложно использовать _TCHAR. Это было полезно, когда нам нужно было поддерживать Win9x (без поддержки Unicode) и WinNT (поддерживает Unicode) из одной базы кода.Но я ожидаю, что в настоящее время вы ориентируетесь на системы на базе NT и поэтому можете быть уверены в поддержке Unicode. В этом случае вы можете использовать wchar_t, wstring и т. Д.

С другой стороны, возможно, это просто простая программа для вашего личного использования. В этом случае, поскольку вашей библиотеке нужны 8-битные символы, возможно, для вас проще всего настроить таргетинг на ANSI.

Но в любом случае я скорее подозреваю, что _TCHAR просто смутит вас. Я бы отказался от этого, если бы был вами.

Конечным моментом является то, что вы указываете, что вы нацеливаете x64, так как ваша система 64 бит. Имейте в виду, что 64-битные системы могут отлично работать с 32-битным кодом. Если вы хотите, чтобы ваша программа могла работать на 32-битной системе, и вам не нужно нажимать кнопку до 64 бит, тогда может быть проще настроить таргетинг на x86.


Ваше редактирование вопроса задает отдельный вопрос, на который я попытаюсь ответить, несмотря на мои оговорки.

Неразрешенный внешний символ Ошибка указывает на то, что компоновщик не смог разрешить этот конкретный символ. Для того, чтобы компоновщик разрешил его, ему должен быть передан .lib-файл, который определяет этот символ. Вы должны дважды проверить, что вы включили все необходимые .lib-файлы в свои дополнительные зависимости. Из того, что я могу почерпнуть, есть несколько .lib-файлов для OpenCV, и вам, вероятно, не хватает того, который определяет cvReleaseImage.

+0

Я понимаю, что вы имеете в виду, и попытался изменить свойства проекта на основе того, что сказал Роджер Роуленд. Посмотрите на «Мой отредактированный раздел на основе предложения Роджера Роуленда». Два вопроса поднялись для меня на основе вашего ответа. 1. Как я могу изменить проект для целевой ANSI я абсолютно новичок в VS и должен ли он помимо изменения свойства набора символов для проекта? 2-Вы теперь, что _TCHAR - это не что-то, написанное мной. Это просто подготовленный код VS, когда вы создаете консольный заголовок с предварительным сжатием в VS, и с тех пор я новичок – sepideh

+1

Да, я понимаю, что VS ведет вас по этому путаному пути. Я всегда снимаю все это и использую 'wchar_t' или' char'. Вы меняете набор символов на мультибайт. Вот и все. –

+0

trhanks @David Heffernan Как я могу сделать ваше второе предложение ** Преобразуйте входной аргумент из UTF-16 в ANSI перед вызовом библиотеки **, так как я новичок в VS, я не знаю, какой будет риск после пропущения TCHAR и как опустить?Основываясь на моем опыте в DEVC++, мы не пользовались TCHAR, мы просто использовали char – sepideh

Смежные вопросы