2011-11-19 8 views
7

Cuando estoy usando Qt (v4.7.4) y Boost (intenté v1.47 y v1.48) juntos en mi proyecto de C++, obtengo un error de enlazador causado por una clase que incluye <boost\filesystem.hpp> . Acabo de configurar Qt y antes de que el código funcionara sin problemas.error de vinculador al usar Qt y Boost

Este es el mensaje de error:

... obj: error LNK2001: símbolo externo sin resolver "privada: clase estática const std :: codecvt * & __cdecl impulso :: filesystem3 :: :: ruta wchar_t_codecvt_facet (void) "(wchar_t_codecvt_facet @ ruta @ @ filesystem3 impulso @@ CAAAPBV $ codecvt @ @ GDH std @@ XZ)

... obj:?? error LNK2001: símbolo externo sin resolver" vacío __cdecl boost :: :: filesystem3 path_traits :: convert (char const *, char const *, clase std :: basic_string, clase std :: allocator> &, clase std :: codecvt const &) "(? convert @ p ath_traits @ filesystem3 @ boost @@ YAXPBD0AAV? $ basic_string @ GU? $ char_traits @ G @ std @@ V? $ allocator @ G @ 2 @@ std @@ ABV? $ codecvt @ GDH @ 5 @@ Z)

... obj: error LNK2001: símbolo externo no resuelto "void __cdecl boost :: filesystem3 :: path_traits :: dispatch (clase boost :: filesystem3 :: directory_entry const &, clase std :: basic_string, clase std :: allocator> & , class std :: codecvt const &) "(? dispatch @ path_traits @ filesystem3 @ boost @@ YAXABVdirectory_entry @ 23 @ AAV? $ basic_string @ GU? $ char_traits @ G @ std @@ V? $ allocator @ G @ 2 @@ std @@ ABV? $ codecvt @ GDH @ 6 @@ Z)

... obj: error LNK2001: símbolo externo no resuelto "void __cdecl boost :: filesystem3 :: path_traits :: convert (unsigned short const *, unsigned) estafa corta st *, clase std :: basic_string, clase std :: allocator> &, clase std :: codecvt const &) "(? convert @ path_traits @ filesystem3 @ boost @@ YAXPBG0AAV? $ basic_string @ DU? $ char_traits @ D @ std @@ V $ asignador @ D @ 2 @@ @@ std ABV $ codecvt @ @ 5 GDH @@ Z)

... exe:?? error grave LNK1120: 4 externos sin resolver

EDIT:

Here he encontrado a alguien que tenga este problema llegar a esta conclusión:

esto realmente es un problema de Qt. Usando wchar_t como tipo nativo, tiene que recompilar Qt usando el mismo interruptor de compilador. Incluso hay un error en el perseguidor: https://bugreports.qt.io/browse/QTBUG-9617

En general, usted tiene que ser muy cuidadoso y no mezclar wchar_t configuración del compilador en sus proyectos, ya que llegarán a ser incompatibles.

Así que volví a compilar la configuración de Qt /Zc:wchar_t, pero no mostró ningún efecto. Todavía recibo el mismo error.

+0

has compilado boost? No estoy muy familiarizado con lo que exactamente se necesita construir, pero algunas bibliotecas sí. – pezcode

+0

sí. Lo he compilado para Visual Studio 2010 usando 'b2.exe' si no recuerdo mal. – Pedro

+0

podría ser necesario volver a compilar toda la biblioteca de impulso? No recuerdo la configuración de compilación exacta, pero definitivamente no cambié la propiedad 'treat wchar_t as build-in type' cuando estaba compilando boost. – Pedro

Respuesta

8

Creo que estás en el camino correcto, pero parece que tu -Zc:wchar_t no se "pegó". Tuvimos que hacer lo mismo para que Qt estuviera contento con Google Breakpad y la biblioteca de la ICU. Cambiamos la configuración /Zc:wchar_t en (QT_SOURCE)\mkspecs\win32-msvc2008\qmake.conf y compilamos Qt desde la fuente, y después de eso todo funciona.

Cuando construye su proyecto que usa Qt y Boost, debería ver esta opción en la salida del compilador. Algo así como:

cl -c -nologo -Zm200 -Zc:wchar_t ... (etc.) 

Si ya construir Qt sin esta opción, es posible que tenga que hacer una primera make confclean para asegurar que todo realmente se reconstruirá con la nueva configuración.

Parece -Zc:wchar_t will be the default in Qt 5.

0

Qt probablemente cambió la tipología de su programa con respecto a la configuración del tiempo de ejecución: por consiguiente, no se encuentra la biblioteca de refuerzo que usa (sistema de archivos), que viene en muchas configuraciones a las que se accede mediante convención de nombres.

Por ejemplo, los tiempos de ejecución multiproceso requieren mt en alguna parte del nombre de la biblioteca (espero recordarlo bien, pero de todos modos vea los documentos donde los detalles están completamente documentados).Este nombramiento es bastante transparente para el programador, debido a los pragmas que impulsan a los programadores que se utilizan de forma adecuada para facilitar el uso de la biblioteca bajo diferentes compiladores.

Debe perderse el sistema de archivos no-wchar. Cuando utilicé Windows, utilicé boost Jam para interactuar con Visual C++ (puede ser que se remonta al pasado millenium!). Espero que todavía sea utilizable.

+1

No estoy seguro de entender. Agregué 'boost_filesystem-vc100-mt-1_47.lib' a mis dependencias y' $ (BOOST) \ stage \ lib' a los directorios. Las rutas son definitivamente buenas, las he copiado de otro proyecto, que se está compilando sin errores. He comprobado la propiedad 'runtime library' de todas mis hojas, y todas están configuradas como' DLL multiproceso (/ MD) ', al igual que en mi otro proyecto. Dado que estas configuraciones son las mismas, supongo que no puede tratarse de un problema de nomenclatura, ¿o estoy equivocado? – Pedro

+0

Lo siento, me he referido incorrectamente a multiproceso y, por lo tanto, _mt_, ha explicado claramente que se produjo un cambio en el tipo de caracteres. Espero poder verificar mi hipotesis en impulso, detalles técnicos apropiados. – CapelliC

2

El uso de boost-1.49, Qt 4.4 y VS2005 tuvo el mismo problema. Ir a propiedades del proyecto, luego establecer "Propiedades de configuración -> C/C++ -> Idioma -> Tratar wchar_t como tipo incorporado" a "Sí" solucionó el problema.

Cuestiones relacionadas