2010-01-07 11 views
5

Hemos compilado QT 4.6 y QWT 5.2.0 para VS2005.Qt, VS2005, Qwt: no se puede usar Q_OBJECT en la clase derivada de los widgets Qwt

Estamos tratando de derivar una clase de QwtDial, y la clase derivada tiene ranuras. Entonces, necesitamos agregar la macro Q_OBJECT. Sin embargo, cuando hacemos eso, el enlazador ahoga este error:

error LNK2001: símbolo externo sin resolver "público: static struct const QMetaObject QwtDial :: staticMetaObject" (? StaticMetaObject @ QwtDial @@ @@ 2UQMetaObject B)

He examinado Qwt.dll con depends, y tiene esa función. Al mirar el archivo .lib con un editor hexadecimal, se muestra que tiene una coincidencia exacta para esa cadena desglosada por nombre.

Tenemos el lib Qwt en el camino. En realidad, si cambio el nombre de la lib, entonces da un error que no puede encontrar el archivo lib. Entonces, sabemos que está buscando la lib correcta.

Si omitimos el Q_OBJECT, todo se vincula y dibuja correctamente utilizando varios widgets QWT, incluidas nuestras clases derivadas Q_t Q_ QJ no Q_.

¿Alguien sabe lo que puede causar este problema de engarce realmente molesto?

ACTUALIZACIÓN:

He verificado que la clase añado el Q_OBJECT que definitivamente está recibiendo un archivo MOC generada por ella. El error de vinculador en realidad proviene de este archivo generado MOC:

moc_GaugeWidget1.obj : error LNK2001: unresolved external symbol "public: static 
    struct QMetaObject const QwtDial::staticMetaObject" 
    ([email protected]@@[email protected]@B) 

Por lo tanto, es que parece algo muy Stange y atípico. El símbolo está definitivamente en la lib.

Respuesta

11

estoy teniendo el mismo problema. Bueno, estoy actualizando un viejo proyecto usando Qt4.4 y VC2003, y estoy usando QwtPlot en lugar de QwtDial. El error es:

LNK2001: símbolo externo sin resolver "público: static struct const QMetaObject QwtPlot :: staticMetaObject" (staticMetaObject @ QwtPlot @@ @@ 2UQMetaObject B?)

Sólo eso. Nada más. He encontrado referencias de foros que apuntan a problemas con las confusiones de depuración/liberación y posiblemente algo relacionado con la eliminación del complemento de Qt Designer.

Esto parece funcionar para mí: Agregue la línea: "DEFINES + = QWT_DLL" a la parte superior del archivo project.pro.

qmake project.pro

nmake liberar

+1

+1: ¡Gracias, ayudó! Creo que falta un interruptor de definición en QWT. Algo así como "si se usa en esta biblioteca, configure QWT_DLL en Q_DECL_EXPORT, de lo contrario, configure QWT_DLL en vacio". Es por eso que debe configurar QWT_DLL para vaciar manualmente si usa encabezados QWT. –

+0

¡Gracias, funciona de verdad! –

1

no estoy seguro acerca de esta respuesta, pero aquí hay algunas informaciones:

Me parece que la clase derivada no tiene una coincidencia moc_ archivo! Los archivos moc normalmente se usan cuando se utiliza la macro Q_OBJECT ... ¡La información de moc de su proyecto se almacena en los archivos Makefile, Makefile.debug y Makefile.release! Es este archivo el que indica qué archivos .cpp necesitan un archivo moc y cuáles no.

Puede encontrar documentación sobre la moc en QtAssistant: http://qt.nokia.com/doc/4.6/moc.html

Ahora, para comprobar esto, tiene que ir en su "generada" carpeta y busque un archivo llamado "moc_yourDerivedClass.cpp".

Si no puede encontrar ningún archivo coincidente, tiene que pasar por el proceso de nuevo con qmake yourderivedClass ... Tal vez cuando se utilizó por primera vez qmake, la macro Q_OBJECT no estaba en la clase sin embargo, y por lo tanto, no moc archivo se ha creado ...

espero que le ayuda un poco!

+0

Sugeriría algo, probablemente no sea realizable, pero será útil para futuros proyectos. Estoy usando un paquete de scripts que un amigo mío desarrolló. Puede encontrarlo aquí: http://www.dprog.net/joomla/index.php?option=com_content&view=article&id=39:qt-integration-scripts&catid=32:qt-integration-scripts&Itemid=47 Hay es un pequeño trabajo que hacer para configurarlo, como especificar qué VS estás usando, qué versión de Qt, dónde está tu archivo .PRO, etc. Y todo lo demás se hace automáticamente, agregando nuevos archivos agregados, creando. Archivos PRI, archivos vcproj ... Es realmente bueno ... –

+0

Con ese paquete, por ejemplo, cuando agrego un archivo, lo pongo en la carpeta correcta, al lado de mi archivo .PRO. Lanzo uno de los script llamado "generate_vcproj.bat" y los scripts generan todo ... Luego uso "Launch_ide.bat" y mi VS se inicia con toda la configuración (también archivos moc;)) –

+0

En cuanto a esta respuesta , no ... definitivamente hay un archivo MOC para esto. (moc_GaugeWidget1.obj: error LNK2001: símbolo externo sin resolver "public: static struct QMetaObject const QwtDial :: staticMetaObject" (? staticMetaObject @ QwtDial @@ 2UQMetaObject @@ B)) ... por lo tanto, hay algún otro problema/error. – darron

1

el problema es con moc file.You debe utilizar Q_DECL_EXPORT (o algo que se le parezca) en QwtPlot definición que diga compilador de esta clase es utilizable por otra biblioteca pero las partes de la clase generadas en el archivo moc no contienen esto, por lo que al vincular esta biblioteca con otro programa, no se sabe cómo vincular esas partes. De todos modos, no tengo ni idea de cómo decirles esto a Qt!

1

Exactamente el mismo problema aquí con qwt 5.2.1, qt 4.6 y VS2008. el mismo código se compila perfectamente en Linux. Todos los archivos de moc se generan y procesan correctamente, no hay bibliotecas mixtas de versión/depuración, voy a informarlo a los errores qwt cuando tenga tiempo.

añadiendo QWT_DLL a la lista de define (propiedades del proyecto-> C++ -> preprocesador-> definiciones) ¡de hecho resuelve el problema!

0

Intente ejecutar qmake nuevamente en el directorio del proyecto.

$ qmake -project

$ qmake vc -tp

Esto es lo que fija el problema para mí. Al leer las explicaciones de "parece que tiene un problema con el archivo moc", que muchas personas han dado, no me quedó claro qué hacer.

Creo que causé mis propios problemas en este caso. Hice clic derecho y compilé el archivo .ui en mi proyecto antes de construir todo el proyecto. De alguna manera eso no generó completamente todos los archivos necesarios. De todos modos, ejecutar qmake es algo útil si repentinamente te encuentras con problemas que no estaban allí previamente.

Sin embargo, había otra cosa que noté en la configuración de mi proyecto, no se establecieron ninguna de las directivas de preprocesador. Ejecutar qmake nuevamente solucionó esto.

Cuestiones relacionadas