2 Libs - Deklarationskonflikt

Post Reply
Message
Author
mvo

2 Libs - Deklarationskonflikt

#1 Post by mvo »

Hallo, ich schon wieder.

Ich verwende in einem C++-Projekt zwei Bibliotheken, die einen Deklarationskonflikt produzieren. Fehlermeldung des Compilers:

/usr/local/lib/qt-x11-free-3.0.4/include/qglobal.h:505: conflicting types for `typedef int INT32'
/usr/X11R6/include/X11/Xmd.h:131: previous declaration as `typedef long int INT32'

Eigentlich gibt es ja den Namespace-Mechanismus, der solche Konflikte loesen soll, aber beide Libs machen keinen Gebrauch davon.

Ich hatte zunaechst eine Loesung gefunden, die zu funktionieren schien: Den '#include <X11/Xmd.h>' aus dem Header meiner eigenen Klasse in den Körper verbannt, die benoetigten Variablen in einer Hilfsklasse gekapselt und im Header die "forward declaration" dafuer benutzt (hier nur skizziert):
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
------------ meine_klasse.h Anfang -----------
class Kapsel;

class Meine_Klasse {
Kapsel X;
};
------------ meine_klasse.h Ende -----------

------------ meine_klasse.cpp Anfang -----------
#include <X11/Xmd.h>

class Kapsel {
Xmd_Variable a;
Xmd_Variable b;
};

Meine_Klasse::Meine_Klasse() {
Kapsel.a = 10;
Kapsel.b = 20;
}
------------ meine_klasse.cpp Ende -----------
</font><hr></pre></blockquote>

Ich verwende den GCC 2.95.3 und alles funktioniert bestens. Jetzt berichtet ein User, bei ihm wuerde genau der oben beschriebene Fehler beim kompilieren auftreten. Er verwendet den GCC 2.95.4, kann dies die Ursache sein? Ist meine Loesung "nicht ganz sauber" und ist der neuere Compiler dort vielleicht penibler?

Wie kann ich diesen Konflikt noch auf andere Art und Weise loesen?

mvo

Re: 2 Libs - Deklarationskonflikt

#2 Post by mvo »

Vielleicht sollte ich das noch etwas praezisieren:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
------------ meine_hauptklasse.h Anfang -----------
#include <qglobal.h>
#include "meine_klasse.h"

class meine_hauptklasse {
...
...
};
------------ meine_hauptklasse.h Ende -----------

------------ meine_klasse.h Anfang -----------
class Kapsel;

class Meine_Klasse {
Kapsel X;
};
------------ meine_klasse.h Ende -----------

------------ meine_klasse.cpp Anfang -----------
#include <X11/Xmd.h>

class Kapsel {
Xmd_Variable a;
Xmd_Variable b;
};

Meine_Klasse::Meine_Klasse() {
Kapsel.a = 10;
Kapsel.b = 20;
}
------------ meine_klasse.cpp Ende -----------
</font><hr></pre></blockquote>
Von dem bemaengelten INT32 mache ich nicht direkt selber Gebrauch.

domseichter
Posts: 57
Joined: 11. Feb 2002 22:08
Location: Laufen
Contact:

Re: 2 Libs - Deklarationskonflikt

#3 Post by domseichter »

Hallo mvo,

Deine Lösung macht denke ich sofort Probleme, sobald jemand mit --enable-final kompiliert.
Ansonsten denke ich, dass Deine Lösung eigentlich funtionieren sollte.
Auf einige X Funktionen kannst Du übrigens über die Klasse QPaintDevice zu greifen, vieleicht hilft das.

Diese INT32 deklaration in QT ist übrigens nur zwecks Source Kompatibilität zu QT 1 vorhanden (zumindest laut qglobal.h. Nach einem kurzen Blick auf dem Quellcode von QT, sollte das Problem nciht auftreten, wenn beim kompilieren von QT QT_CLEAN_NAMESPACE definiert ist. Vieleicht lässt sich damit was machen. Hast du schon probiert ein
#define QT_CLEAN_NAMESPACE
in Deinen Code einzubauen?

CU Dom
<!--http--><a href="http://www.kbarcode.net" target="_blank">kbarcode.net</a><!--url--> - <!--http--><a href="http://www.krename.net" target="_blank">krename.net</a><!--url-->

mvo

Re: 2 Libs - Deklarationskonflikt

#4 Post by mvo »

>Deine Lösung macht denke ich sofort Probleme, sobald jemand mit --enable-final kompiliert.
Stimmt, dann erhalte ich genau die Fehermeldungen. Ich werde dem User sagen, er soll es mal ohne bzw. mit --enable-final=no probieren.

>#define QT_CLEAN_NAMESPACE
Wenn ich das tue, fehlen die zwei Zeilen mit dem INT32 Konflikt, aber es kommt trotzdem ein ganzer Rattenschwanz an Fehlern, aus denen ich nicht ganz schlau werde:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
In file included from /usr/qt/3/include/qwindowdefs.h:45,
from /usr/qt/3/include/qwidget.h:42,
from /usr/qt/3/include/qframe.h:42,
from /usr/qt/3/include/qlabel.h:42,
from gammactrl.cpp:19,
from libkcm_kgamma_la.all_cpp.cpp:3:
/usr/qt/3/include/qnamespace.h:628: parse error before `0'
/usr/qt/3/include/qnamespace.h:647: missing ';' before right brace
/usr/qt/3/include/qnamespace.h:651: `arrowCursor' declared as reference but not initialized
/usr/qt/3/include/qnamespace.h:652: `upArrowCursor' declared as reference but not initialized
/usr/qt/3/include/qnamespace.h:653: `crossCursor' declared as reference but not initialized
/usr/qt/3/include/qnamespace.h:654: `waitCursor' declared as reference but not initialized
/usr/qt/3/include/qnamespace.h:655: `ibeamCursor' declared as reference but not initialized
/usr/qt/3/include/qnamespace.h:656: `sizeVerCursor' declared as reference but not initialized
/usr/qt/3/include/qnamespace.h:657: `sizeHorCursor' declared as reference but not initialized
/usr/qt/3/include/qnamespace.h:658: `sizeBDiagCursor' declared as reference but not initialized
/usr/qt/3/include/qnamespace.h:659: `sizeFDiagCursor' declared as reference but not initialized
/usr/qt/3/include/qnamespace.h:660: `sizeAllCursor' declared as reference but not initialized
/usr/qt/3/include/qnamespace.h:661: `blankCursor' declared as reference but not initialized
/usr/qt/3/include/qnamespace.h:662: `splitVCursor' declared as reference but not initialized
/usr/qt/3/include/qnamespace.h:664: `splitHCursor' declared as reference but not initialized
/usr/qt/3/include/qnamespace.h:666: `pointingHandCursor' declared as reference but not initialized
/usr/qt/3/include/qnamespace.h:667: `forbiddenCursor' declared as reference but not initialized
/usr/qt/3/include/qnamespace.h:668: `whatsThisCursor' declared as reference but not initialized
/usr/qt/3/include/qnamespace.h:753: parse error before `}'
In file included from /usr/qt/3/include/qobject.h:45,
from /usr/qt/3/include/qwidget.h:43,
from /usr/qt/3/include/qframe.h:42,
from /usr/qt/3/include/qlabel.h:42,
from gammactrl.cpp:19,
from libkcm_kgamma_la.all_cpp.cpp:3:
/usr/qt/3/include/qevent.h:59: parse error before `0L'
/usr/qt/3/include/qevent.h:125: missing ';' before right brace
/usr/qt/3/include/qevent.h:128: parse error before `)'
/usr/qt/3/include/qevent.h:129: destructors must be member functions
/usr/qt/3/include/qevent.h:129: virtual outside class declaration
/usr/qt/3/include/qevent.h:130: syntax error before `('
/usr/qt/3/include/qevent.h:131: non-member function `spontaneous()' cannot have `const' method qualifier
/usr/qt/3/include/qevent.h: In function `bool spontaneous()':
/usr/qt/3/include/qevent.h:131: `spont' undeclared (first use this function)
/usr/qt/3/include/qevent.h:131: (Each undeclared identifier is reported only once
/usr/qt/3/include/qevent.h:131: for each function it appears in.)
/usr/qt/3/include/qevent.h:131: warning: control reaches end of non-void function `spontaneous()'
/usr/qt/3/include/qevent.h: At top level:
/usr/qt/3/include/qevent.h:132: parse error before `protected'
/usr/qt/3/include/qevent.h:136: syntax error before `:'
/usr/qt/3/include/qevent.h:139: `friend' can only be specified inside a class
/usr/qt/3/include/qevent.h:140: `friend' can only be specified inside a class
/usr/qt/3/include/qevent.h:141: `friend' can only be specified inside a class
/usr/qt/3/include/qevent.h:142: parse error before `}'
/usr/qt/3/include/qevent.h: In method `QTimerEvent::QTimerEvent(int)':
/usr/qt/3/include/qevent.h:149: `Timer' undeclared (first use this function)
/usr/qt/3/include/qevent.h: In method `QMouseEvent::QMouseEvent(QEvent::Type, const QPoint &, const QPoint &, int, int)':
/usr/qt/3/include/qevent.h:163: parameter `type' has incomplete type
/usr/qt/3/include/qevent.h:163: confused by earlier errors, bailing out
</font><hr></pre></blockquote>

domseichter
Posts: 57
Joined: 11. Feb 2002 22:08
Location: Laufen
Contact:

Re: 2 Libs - Deklarationskonflikt

#5 Post by domseichter »

Hmmmm - Aus dieser Fehlermeldung werd ich auch nicht schlau, vor allem da in qnamespace.h nie QT_CLEAN_NAMESPACE verwendet wird und so weit ich sehe auch nichts anderes das durch die Verwendung von QT_CLEAN_NAMESPACE abgeschalten wird.
Aber da Dein Code mit --enable-final kompiliert worden ist könnte es (ich vermute es muss) an etwas anderem liegen. Frag mich aber nicht an was.

CU Dom
<!--http--><a href="http://www.kbarcode.net" target="_blank">kbarcode.net</a><!--url--> - <!--http--><a href="http://www.krename.net" target="_blank">krename.net</a><!--url-->

mvo

Re: 2 Libs - Deklarationskonflikt

#6 Post by mvo »

Folgendes habe ich noch rausgefunden:
Weder --enable-final noch #define QT_CLEAN_NAMESPACE verursachen diese Fehler. Es _muss_ irgend etwas in den X11-Headern sein. Wenn ich es rausfinde, melde ich mich hier wieder.

Fuer den ersten Hinweis mit --enable-final erstmal Danke. Das hilft ja auch schon weiter, wenn das Uebel auch nicht an der Wurzel ausgemerzt wurde :).

mvo

Re: 2 Libs - Deklarationskonflikt

#7 Post by mvo »

Noch weiter eingegrenzt: X11/Xlib.h und X11/Xutil.h sind die Ausloeser.

Jetzt habe ich eine Reihe Programmsourcen incl. Qt-Kernel durchforstet, in denen die auch verwendet werden, finde aber nicht heraus, was ich falsch mache. Das Problem tritt auch dann auf, wenn ich qt_x11.h direkt einbinde (sollte man ja normalerweise nicht machen, da nicht zur API gehoerend).

mvo

Re: 2 Libs - Deklarationskonflikt

#8 Post by mvo »

Hurra, die Loesung fand sich in qevent.h:
<blockquote><hr>
// NOTE: if you get a strange compiler error on the line with "None",
// it's probably because you're trying to include X11, which
// has a mess of #defines in it. Put the messy X11 includes
// *AFTER* the nice clean Qt includes.

None = 0, // invalid event
<hr></blockquote>

Post Reply