Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
2 Libs - Deklarationskonflikt

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Programmieren - C
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
mvo
Gast





BeitragVerfasst am: 28. Mai 2002 19:15   Titel: 2 Libs - Deklarationskonflikt

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):
code:

------------ 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 -----------



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
Gast





BeitragVerfasst am: 28. Mai 2002 19:38   Titel: Re: 2 Libs - Deklarationskonflikt

Vielleicht sollte ich das noch etwas praezisieren:
code:

------------ 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 -----------


Von dem bemaengelten INT32 mache ich nicht direkt selber Gebrauch.
 

domseichter



Anmeldungsdatum: 11.02.2002
Beiträge: 57
Wohnort: Laufen

BeitragVerfasst am: 29. Mai 2002 12:37   Titel: Re: 2 Libs - Deklarationskonflikt

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-->
 
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen

mvo
Gast





BeitragVerfasst am: 29. Mai 2002 16:37   Titel: Re: 2 Libs - Deklarationskonflikt

>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:
code:

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

 

domseichter



Anmeldungsdatum: 11.02.2002
Beiträge: 57
Wohnort: Laufen

BeitragVerfasst am: 29. Mai 2002 16:48   Titel: Re: 2 Libs - Deklarationskonflikt

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-->
 
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen

mvo
Gast





BeitragVerfasst am: 29. Mai 2002 18:09   Titel: Re: 2 Libs - Deklarationskonflikt

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 Smile.
 

mvo
Gast





BeitragVerfasst am: 30. Mai 2002 11:06   Titel: Re: 2 Libs - Deklarationskonflikt

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
Gast





BeitragVerfasst am: 30. Mai 2002 12:10   Titel: Re: 2 Libs - Deklarationskonflikt

Hurra, die Loesung fand sich in qevent.h:


// 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

 

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Programmieren - C Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy