#c #qt4
#c #qt4
Вопрос:
Привет, мне нужно преобразовать std::wstring
в QString
, и я попробовал наиболее очевидный способ
std::wstring wideString;
QString qtString = QString::fromStdWString(wideString);
Я получил ошибку:
Ошибка 2 ошибка LNK2019: неразрешенный внешний символ
"__declspec(dllimport) public: static class QString __cdecl QString::fromStdWString(class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > const amp;)" (__imp_?fromStdWString@QString@@SA?AV1@ABV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@Z)
ссылка в функции
"public: void __thiscall FileHandler::deleteDir(class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >amp;,int,unsigned int,bool,bool)" (?deleteDir@FileHandler@@QAEXAAV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@HI_N1@Z)
filehandler.objОшибка 3 неустранимая ошибка LNK1120: 1 неразрешенные внешние C:UsersDocumentsVisual Studio 2008Projectsproduct_devdeletefilesDebugFileHandler.exe
Я также пытался использовать метод QString::fromWCharArray
:
qstring temp = QString::fromWCharArray(const_cast<wchar_t*>(wideString.c_str()),wideString.size());
Ошибка, которую я получаю, является
Ошибка 2 ошибка LNK2019: неразрешенный внешний символ
"__declspec(dllimport) public: static class QString __cdecl QString::fromWCharArray(wchar_t const*,int)" (__imp_?fromWCharArray@QString@@SA?AV1@PB_WH@Z)
ссылка в функции
"public: void __thiscall FileHandler::deleteDir(class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >amp;,int,unsigned int,bool,bool)" (?deleteDir@FileHandler@@QAEXAAV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@HI_N1@Z)
filehandler.objОшибка 3 неустранимая ошибка LNK1120: 1 неразрешенные внешние C:UsersDocumentsVisual Studio 2008Projectsproduct_devdeletefilesDebugFileHandler.exe 1
Как мне приступить к решению этой проблемы?
Ответ №1:
Лучшее решение проблемы — установить для параметра «Обрабатывать wchar_t как встроенный тип» значение No. Однако в некоторых случаях это может быть невозможно.
Например, xerces_c компилируется с wchar_t в качестве встроенного типа. Если вам нужно использовать оба xerces_c, то вы должны либо перекомпилировать QT, либо xerces_c, чтобы соответствовать общему встроенному параметру типа.
Windows использует кодировку UTF16, как и QT для строк в Юникоде. Таким образом, приведенное ниже альтернативное решение может спасти жизнь.
/*! Convert a QString to an std::wstring */
std::wstring qToStdWString(const QString amp;str)
{
#ifdef _MSC_VER
return std::wstring((const wchar_t *)str.utf16());
#else
return str.toStdWString();
#endif
}
/*! Convert an std::wstring to a QString */
QString stdWToQString(const std::wstring amp;str)
{
#ifdef _MSC_VER
return QString::fromUtf16((const ushort *)str.c_str());
#else
return QString::fromStdWString(str);
#endif
}
Ответ №2:
Отредактируйте настройки проекта Visual Studio и в C / C -> Language установите для параметра Обрабатывать wchar_t, который был встроенным типом, значение No.
Комментарии:
1. Я, <a href=» and» rel=»nofollow noreferrer»> qt-project.org/forums/viewthread/23714 «> и несколько других людей</ a> получили эту ошибку с параметром, установленным в No . Он установил для нее значение Yes , что позволило скомпилировать объект, но не уверен, работает ли это вообще во время выполнения или что это на самом деле меняет.
2. @neuviemeporte Должен ли параметр Visual Studio быть «Да» или «Нет», зависит от параметра, который использовался при компиляции библиотеки Qt. Если вы запустите средство обхода зависимостей и сравните список типов в экспорте со списком типов в ошибке компоновщика, вы должны увидеть несоответствие (
wchar_t
противunsigned short
). Вы должны настроить настройки вашего приложения, чтобы они соответствовали. Это не окажет никакого влияния на поведение во время выполнения; это просто инструктирует компилятор создать правильно введенную запись импорта для компоновщика для разрешения.3. привет, старый пост, но я получаю ту же ошибку в qt creator [qt 5.8.2] после связывания cpprest. где я могу установить такие настройки в qt creator?
Ответ №3:
Это даже может произойти, если QtCore4.lib связан правильно. Убедитесь, что опция VS «Обрабатывать wchar_t как встроенный тип» отключена.
Ответ №4:
Добавить
QT = core
для вашего .pro
файла. Это приводит к тому, что вам предлагается сделать в другом ответе. (обязательно повторно запустите qmake)
Ответ №5:
boost::filesystem:: path также, похоже, требует настройки проекта «обрабатывать wchar как встроенный тип = yes», поэтому решение vahapt было единственным, которое я мог заставить работать.
Ответ №6:
Я видел похожую проблему, но ни одно из этих решений не сработало. В конце концов я понял, что компилирую с Visual Studio 2017, но ссылаюсь на Qt, скомпилированный с Visual Studio 2013. Как только я выбрал правильную версию, она работала нормально.
Ответ №7:
Библиотека QtCore не подключается к вашему приложению. Проверьте настройки вашего проекта и убедитесь, что QtCore4.lib находится в списке включенных библиотек и что пути для его поиска настроены правильно.