Reputation: 3870
Hi I need to convert a std::wstring
to QString
and I tried the most obvious way of
std::wstring wideString;
QString qtString = QString::fromStdWString(wideString);
I got the error:
Error 2 error LNK2019: unresolved external symbol
"__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)
referenced in function
"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.objError 3 fatal error LNK1120: 1 unresolved externals C:\Users\Documents\Visual Studio 2008\Projects\product_dev\deletefiles\Debug\FileHandler.exe
I also tried using the method QString::fromWCharArray
:
qstring temp = QString::fromWCharArray(const_cast<wchar_t*>(wideString.c_str()),wideString.size());
The error I get is
Error 2 error LNK2019: unresolved external symbol
"__declspec(dllimport) public: static class QString __cdecl QString::fromWCharArray(wchar_t const*,int)" (__imp_?fromWCharArray@QString@@SA?AV1@PB_WH@Z)
referenced in function
"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.objError 3 fatal error LNK1120: 1 unresolved externals C:\Users\Documents\Visual Studio 2008\Projects\product_dev\deletefiles\Debug\FileHandler.exe 1
How do I proceed to resolve this issue?
Upvotes: 15
Views: 12931
Reputation: 9087
I was seeing a similar problem but none of these solutions worked. I eventually realised I was compiling with Visual Studio 2017 but linking to Qt compiled with Visual Studio 2013. Once I selected the right version it worked fine.
Upvotes: 0
Reputation: 1715
Best solution to the problem is to set the option "Treat wchar_t was Built-in Type" to No. However in some cases this might not be possible.
For example xerces_c is compiled with wchar_t as Built-in Type. If you need to use both xerces_c then you must either recompile QT or xerces_c to match a common Built-in Type setting.
Windows uses UTF16 charset so does QT for unicode strings. Thus, the alternative solution below might be a life saver.
/*! 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
}
Upvotes: 24
Reputation: 1447
boost::filesystem::path also seems to require the project setting "treat wchar as built-in type = yes", so vahapt's solution was the only one I could get to work.
Upvotes: 0
Reputation: 1400
Edit your Visual Studio project settings and under C/C++ -> Language set the option Treat wchar_t was Built-in Type to No.
Upvotes: 19
Reputation: 76785
Add
QT += core
to you .pro
file. This results in what the other answer tell you to do. (be sure to rerun qmake)
Upvotes: 0
Reputation: 6093
This even may happen if QtCore4.lib is linked correctly. Make sure that the VS option "Treat wchar_t as built in type" is turned OFF.
Upvotes: 1
Reputation: 1
The QtCore library is not being linked into your application. Check your project settings and make sure that QtCore4.lib is in the list of included libraries and that the paths are properly set up to find it.
Upvotes: -1