繁体   English   中英

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

[英]Conversion of std::wstring to QString throws linker error

嗨,我需要将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)

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

错误3致命错误LNK1120:1未解决的外部C:\\ Users \\ Documents \\ Visual Studio 2008 \\ Projects \\ product_dev \\ deletefiles \\ Debug \\ FileHandler.exe 1

如何继续解决此问题?

解决该问题的最佳方法是将选项“ Treat wchar_t was Built-in Type”设置为No。但是,在某些情况下,这可能是不可能的。

例如,xerces_c使用wchar_t作为内置类型进行编译。 如果需要同时使用xerces_c和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
}

编辑您的Visual Studio项目设置,然后在C / C ++->语言下设置选项对待wchar_t为内置类型No。

如果QtCore4.lib正确链接,甚至可能发生这种情况。 确保VS选项“将wchar_t作为内置类型处理”已关闭。

boost :: filesystem :: path似乎也需要项目设置“将wchar作为内置类型= yes”,因此vahapt的解决方案是我唯一可以使用的解决方案。

我看到了类似的问题,但是这些解决方案均无效。 我最终意识到我正在使用Visual Studio 2017进行编译,但是链接到使用Visual Studio 2013编译的Qt。一旦选择了正确的版本,它就可以正常工作。

QT += core

.pro文件。 这将导致其他答案告诉您要做的事情。 (请务必重新运行qmake)

QtCore库未链接到您的应用程序。 检查项目设置,并确保QtCore4.lib在包含的库列表中,并且正确设置了路径以找到它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM