Преобразование std::wstring в QString приводит к ошибке компоновщика

#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 находится в списке включенных библиотек и что пути для его поиска настроены правильно.