2011-04-11 10 views
13

Hola necesito para convertir un std::wstring a QString y yo trataba de la forma más obvia deConversión de std :: wstring a QString lanza error de vinculador

std::wstring wideString; 
QString qtString = QString::fromStdWString(wideString); 

Tengo el 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 &)" ([email protected]@@[email protected][email protected][email protected][email protected]@@[email protected][email protected]@@[email protected]@@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)" ([email protected]@@[email protected][email protected][email protected]@@[email protected][email protected]@@[email protected]@[email protected]) filehandler.obj

Error 3 fatal error LNK1120: 1 unresolved externals C:\Users\Documents\Visual Studio 2008\Projects\product_dev\deletefiles\Debug\FileHandler.exe

también he intentado usar el método QString::fromWCharArray:

qstring temp = QString::fromWCharArray(const_cast<wchar_t*>(wideString.c_str()),wideString.size()); 

la sala de emergencias Para obtener es

Error 2 error LNK2019: unresolved external symbol "__declspec(dllimport) public: static class QString __cdecl QString::fromWCharArray(wchar_t const*,int)" ([email protected]@@[email protected][email protected])

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)" ([email protected]@@[email protected][email protected][email protected]@@[email protected][email protected]@@[email protected]@[email protected]) filehandler.obj

Error 3 fatal error LNK1120: 1 unresolved externals C:\Users\Documents\Visual Studio 2008\Projects\product_dev\deletefiles\Debug\FileHandler.exe 1

¿Cómo procedo a resolver este problema?

Respuesta

17

Editar la configuración del proyecto de Visual Studio y bajo C++/C -> Idioma establezca la opción Tratar wchar_t se Incorporado Tipo de a Sin.

+2

I, and a few other people tiene este error con la opción establecida en * No *. Lo estaba estableciendo en * Sí * que lo compiló, pero no estoy seguro de si incluso funciona durante el tiempo de ejecución, o de lo que realmente cambia. – neuviemeporte

+2

@neuviemeporte Si la configuración de Visual Studio debe ser "Sí" o "No" depende de la configuración que se utilizó al compilar la biblioteca de Qt. Si activa Dependency Walker y compara la lista de tipos en la exportación con la lista de tipos en el error del enlazador, debería ver una discrepancia ('wchar_t' vs.' unsigned short').Debes ajustar la configuración de tu aplicación para que coincida. Esto no tendrá ningún efecto en el comportamiento de tiempo de ejecución; simplemente ordena al compilador que produzca una entrada de importación correctamente tipada para que el vinculador la resuelva. – IInspectable

+0

hola, publicación anterior pero obtengo el mismo error en el creador de qt [qt 5.8.2] después de vincular cpprest. ¿Dónde puedo establecer dicha configuración en qt creador? – Hummingbird

-1

La biblioteca QtCore no está siendo vinculada a su aplicación. Compruebe la configuración de su proyecto y asegúrese de que QtCore4.lib se encuentre en la lista de bibliotecas incluidas y de que las rutas estén configuradas correctamente para encontrarlo.

1

Esto incluso puede suceder si QtCore4.lib está vinculado correctamente. Asegúrese de que la opción VS "Tratar wchar_t como tipo incorporado" esté desactivada.

0

Añadir

QT += core 

a que el archivo .pro. Esto da como resultado lo que la otra respuesta le indica que haga. (Asegúrese de volver a ejecutar qmake)

22

La mejor solución al problema es establecer la opción "Tratar wchar_t fue tipo incorporado" a No. Sin embargo, en algunos casos esto podría no ser posible.

Por ejemplo, xerces_c se compila con wchar_t como tipo incorporado. Si necesita usar ambos xerces_c, entonces debe recompilar QT o xerces_c para que coincida con una configuración común de Tipo Incorporado.

Windows usa el conjunto de caracteres UTF16, así como QT para cadenas unicode. Por lo tanto, el alternative solution a continuación podría ser un salvavidas.

/*! 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 
} 
0

impulso :: :: sistema de ficheros ruta también parece requerir el establecimiento de "tratar wchar como tipo incorporado = yes" el proyecto, por lo que la solución de vahapt era el único que podía ir a trabajar.

0

Estaba viendo un problema similar pero ninguna de estas soluciones funcionó. Finalmente me di cuenta de que estaba compilando con Visual Studio 2017 pero vinculando a Qt compilado con Visual Studio 2013. Una vez que seleccioné la versión correcta, funcionó bien.

Cuestiones relacionadas