Pagina 1 di 1

Baghira, Xmd, QT: problema di inclusioni e soluzione

Inviato: gio 15 mag 2008, 14:52
da leso
Buon giorno a tutti,
cercando di compilare Baghira http://www.kde-look.org/content/show.ph ... ntent=8692 su Slackware 12.1 (appena installata) mi sono imbattuto in un errore di inclusione:

Codice: Seleziona tutto

In file included from /usr/include/X11/extensions/XI.h:55,
                 from /usr/include/X11/extensions/XInput.h:56,
                 from /usr/include/X11/extensions/XTest.h:50,
                 from menu.cpp:42:
/usr/include/X11/Xmd.h:137: error: conflicting declaration 'typedef long int INT32'
/usr/lib/qt/include/qglobal.h:710: error: 'INT32' has a previous declaration as 'typedef int INT32'
Il problema non è in Baghira, ma in una doppia dichiarazione tra qglobal di QT e Xmd di X11.
Visto che la cosa mi è sembrata abbastanza grave ecco una mia soluzione: ho aggiunto prima della linea 137 le seguenti modifiche:

Codice: Seleziona tutto

#ifdef LONG64
typedef long INT64;
typedef int INT32;
#else
#ifndef QGLOBAL_H       // Added by Leso
typedef long INT32;
#endif                  // Added by Leso
#endif
typedef short INT16;
#endif
In questo modo, se la #ifdef di qglobal viene soddisfatta, la variabile non viene ridichiarata due volte.

E' troppo grezza come soluzione? :violent1:
Vale la pena di aprire un bug? E, se sì, a chi? X11, QT, Slackware? :dontknow:

Re: Baghira, Xmd, QT: problema di inclusioni e soluzione

Inviato: gio 15 mag 2008, 14:57
da conraid
leso ha scritto: E, se sì, a chi? X11, QT, Slackware? :dontknow:
Tu cosa hai modificato?

Il problema IMHO sono le QT. Bisogna vedere se viene sempre richiamato quell'header dalle QT però.
Slackware no. Perché io posso installare Slackware senza QT e quindi quella dichiarazione immagino serva.
X11 idem come sopra.
Le QT invece hanno bisogno di X11, ma se quel file non viene sempre richiamato e c'è bisogno di quella variabile allora serve anche alle QT.
Magari spetta al programma verificare.

Re: Baghira, Xmd, QT: problema di inclusioni e soluzione

Inviato: gio 15 mag 2008, 15:08
da leso
Ho modificato: /usr/include/X11/Xmd.h

Il problema credo sia nell'inclusione di entrambi gli header:

Codice: Seleziona tutto

/usr/include/X11/Xmd.h
/usr/lib/qt/include/qglobal.h
Insomma mi suggerisci di aprire il bug a Baghira?

Re: Baghira, Xmd, QT: problema di inclusioni e soluzione

Inviato: gio 15 mag 2008, 15:10
da conraid
leso ha scritto:Ho modificato: /usr/include/X11/Xmd.h

Il problema credo sia nell'inclusione di entrambi gli header:

Codice: Seleziona tutto

/usr/include/X11/Xmd.h
/usr/lib/qt/include/qglobal.h
Insomma mi suggerisci di aprire il bug a Baghira?
Ma quegli header sono identici? o esportano anche altro?
IMHO sì, segnalano a Baghira, anche se sinceramente vado ad intuito.
Hai provato a vedere altri software che soluzione adottano?

Re: Baghira, Xmd, QT: problema di inclusioni e soluzione

Inviato: gio 15 mag 2008, 15:18
da conraid
Ho dato un occhiata veloce e da ignorante, ma quella dichiarazione in qglobal si ha per compatibilità con qt1

Codice: Seleziona tutto

 #if !defined(QT_CLEAN_NAMESPACE)
// source compatibility with Qt 1.x
typedef signed char             INT8;           // 8 bit signed
typedef unsigned char           UINT8;          // 8 bit unsigned
typedef short                   INT16;          // 16 bit signed
typedef unsigned short          UINT16;         // 16 bit unsigned
typedef int                     INT32;          // 32 bit signed
typedef unsigned int            UINT32;         // 32 bit unsigned
#endif

Re: Baghira, Xmd, QT: problema di inclusioni e soluzione

Inviato: gio 15 mag 2008, 15:23
da leso
Allora, in /usr/include/X11/Xmd.h ho trovato alla riga 133:

Codice: Seleziona tutto

#ifdef LONG64
typedef long INT64;
typedef int INT32;
#else
typedef long INT32;
#endif
Mentre in /usr/lib/qt/include/qglobal.h all'inizio del file (riga 41) c'è un controllo:

Codice: Seleziona tutto

#ifndef QGLOBAL_H
#define QGLOBAL_H
Alla riga 703 dello stesso file si trova:

Codice: Seleziona tutto

#if !defined(QT_CLEAN_NAMESPACE)
// source compatibility with Qt 1.x
typedef signed char             INT8;           // 8 bit signed
typedef unsigned char           UINT8;          // 8 bit unsigned
typedef short                   INT16;          // 16 bit signed
typedef unsigned short          UINT16;         // 16 bit unsigned
typedef int                     INT32;          // 32 bit signed
typedef unsigned int            UINT32;         // 32 bit unsigned
#endif
In particolare il problema sta nella riga 709:

Codice: Seleziona tutto

typedef int                     INT32;          // 32 bit signed
Come hai detto tu, è una sezione di compatibilità con QT1. Quindi da qualche parte, probabilmente in Baghira, si richiamano le librerie di QT1 e al contempo INT32 dichiarato a long. Insomma, un pasticcio da sviluppatori... :(

Segnalerò a Baghira.... :-k