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.
+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. –
¡Gracias, funciona de verdad! –