Преобразование std :: wstring в QString вызывает ошибку компоновщика - PullRequest
13 голосов
/ 11 апреля 2011

Привет, мне нужно конвертировать 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 &)" (__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> >&,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: \ Users \ Documents \ Visual Studio 2008 \ Projects \ product_dev \ deletefiles \ Debug \ FileHandler.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> >&,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: \ Users \ Documents \ Visual Studio 2008 \ Projects \ product_dev \ deletefiles \ Debug \ FileHandler.exe 1

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

Ответы [ 7 ]

23 голосов
/ 13 декабря 2011

Лучшее решение проблемы - установить для параметра «Обрабатывать встроенный тип wchar_t» значение Нет. Однако в некоторых случаях это может быть невозможно.

Например, xerces_c скомпилирован с wchar_t как встроенный тип. Если вам нужно использовать оба xerces_c, вы должны либо перекомпилировать QT, либо xerces_c, чтобы соответствовать общему параметру Встроенного типа.

Windows использует кодировку UTF16, также как и QT для строк Unicode. Таким образом, альтернативное решение ниже может быть спасением жизни.

/*! Convert a QString to an std::wstring */
std::wstring qToStdWString(const QString &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 &str)
{
#ifdef _MSC_VER
    return QString::fromUtf16((const ushort *)str.c_str());
#else
    return QString::fromStdWString(str);
#endif
}
19 голосов
/ 26 июля 2011

Отредактируйте настройки проекта Visual Studio и в C / C ++ -> Language установите параметр Обрабатывать wchar_t для встроенного типа в Нет .

1 голос
/ 15 апреля 2011

Это может даже произойти, если QtCore4.lib связан правильно.Убедитесь, что опция VS "Обрабатывать wchar_t как встроенный тип" отключена.

0 голосов
/ 14 октября 2017

Я видел похожую проблему, но ни одно из этих решений не помогло.В конце концов я понял, что компилирую с Visual Studio 2017, но связываюсь с Qt, скомпилированным с Visual Studio 2013. Как только я выбрал правильную версию, все заработало.

0 голосов
/ 06 января 2015

boost :: filesystem :: path также, похоже, требует настройки проекта "рассматривать wchar как встроенный тип = да", поэтому решение vahapt было единственным, которое я смог получить.

0 голосов
/ 16 апреля 2011

Добавьте

QT += core

к вам .pro файл.Это приводит к тому, что другой ответ скажет вам сделать.(обязательно перезапустите qmake)

0 голосов
/ 11 апреля 2011

Библиотека QtCore не связана с вашим приложением. Проверьте настройки вашего проекта и убедитесь, что QtCore4.lib находится в списке включенных библиотек и что пути для его поиска настроены правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...