将std :: wstring转换为QString会引发链接器错误

Ete*_*ner 13 c++ qt4

嗨,我需要转换std::wstringQString和我尝试最明显的方式

std::wstring wideString;
QString qtString = QString::fromStdWString(wideString);
Run Code Online (Sandbox Code Playgroud)

我收到了错误:

错误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());
Run Code Online (Sandbox Code Playgroud)

我得到的错误是

错误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

如何解决此问题?

vah*_*apt 23

该问题的最佳解决方案是将选项"将wchar_t为内置类型"设置为否.但在某些情况下,这可能无法实现.

例如,xerces_c使用wchar_t编译为内置类型.如果您需要同时使用xerces_c,则必须重新编译QT或xerces_c以匹配常见的内置类型设置.

Windows使用UTF16字符集,因此对于unicode字符串使用QT.因此,下面的替代解决方案可能是一个救生员.

/*! 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
}
Run Code Online (Sandbox Code Playgroud)


Luc*_*uke 19

编辑您的Visual Studio项目设置,在C/C++ - >语言设置选项款待wchar_t的是内置型.

  • @neuviemeporte Visual Studio设置是"是"还是"否"取决于编译Qt库时使用的设置.如果启动Dependency Walker并将导出中的类型列表与链接器错误中的类型列表进行比较,则应该看到不匹配(`wchar_t`与`unsigned short`).您必须调整应用程序的设置才能匹配.这对运行时行为没有任何影响; 它只是指示编译器生成一个正确类型的导入条目供链接器解析. (3认同)
  • 我,<a rel="nofollow noreferrer" href="http://qt-project.org/forums/viewthread/23714">以及其他一些人</a>在选项设置为*No*时出现此错误.它将它设置为*Yes*,它可以编译,但不确定它是否在运行时运行,或者它实际发生了什么变化. (2认同)