您好我需要将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
如何解决此问题?
答案 0 :(得分:23)
问题的最佳解决方案是将“将wchar_t为内置类型”选项设置为否。 但在某些情况下,这可能是不可能的。
例如,使用wchar_t作为内置类型编译xerces_c。如果您需要同时使用xerces_c,则必须重新编译QT或xerces_c以匹配常见的内置类型设置。
Windows使用UTF16字符集,因此对于unicode字符串执行QT。因此,下面的alternative solution可能会节省生命。
/*! 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
}
答案 1 :(得分:19)
编辑Visual Studio项目设置,并在 C / C ++ - &gt;下编辑。语言将选项将wchar_t为内置类型设置为否。
答案 2 :(得分:1)
如果正确链接QtCore4.lib,甚至可能会发生这种情况。 确保VS选项“将wchar_t视为内置类型”处于关闭状态。
答案 3 :(得分:0)
添加
QT += core
给你.pro
档案。这导致其他答案告诉您要做的事情。 (务必重新运行qmake)
答案 4 :(得分:0)
boost :: filesystem :: path似乎也需要项目设置“将wchar视为内置类型=是”,因此vahapt的解决方案是我唯一可以使用的解决方案。
答案 5 :(得分:0)
我看到了类似的问题,但这些解决方案都没有奏效。我最终意识到我正在使用Visual Studio 2017进行编译,但链接到使用Visual Studio 2013编译的Qt。一旦我选择了正确的版本,它就可以正常工作。
答案 6 :(得分:-1)
QtCore库未链接到您的应用程序。检查项目设置并确保QtCore4.lib位于包含的库列表中,并且路径已正确设置以便找到它。