Struct in mehreren Quellcode-Dateien verwenden

Servus,

ich werd noch wahnsinnig. Das folgende Problem nervt mich jetzt schon seit längerem und keiner in meinem Umkreis hat eine Ahnung, warum man anscheinend keine public structs in Headern definieren kann.

Header (main.h)

#ifndef MAIN\_H\_
#define MAIN\_H\_

#include 
#include "TrayIcon.h"

// public struct for accessing special functions
struct Globals {
 QApplication \*app;
 TrayIcon \*tray\_icon;
} G;

#endif /\* MAIN\_H\_ \*/

Quellcode (main.cpp)

#include "main.h"

int main(int argc, char \*argv[]) {
 G.app = new QApplication(argc, argv);
 G.app-\>setQuitOnLastWindowClosed(false);

 G.tray\_icon = new TrayIcon();
 G.tray\_icon-\>show();

 return G.app-\>exec();
}

Schmeisst:

debug/main.o: In function `main':
/home/michi/workspace/SDApp Frontend/main.cpp:6: multiple definition of `G'
debug/TrayIcon.o:/home/michi/workspace/SDApp Frontend/TrayIcon.cpp:3: first defined here

Dabei wird G nichtmal annähernd in der Datei TrayIcon.cpp verwendet noch definiert (die main.h wird lediglcih eingebunden, weil später ein Zugriff folgen soll). Wie man vermutlich erkennen kann, ist Qt mit im Spiel, sollte aber nicht weiter stören.

Hilfe! Danke im Voraus.
michi

laut beispiel

struct Globals {
QApplication *app;
TrayIcon *tray_icon;
} G;

extern struct Globals globals;

#endif /* MAIN_H_ */

Hi

// public struct for accessing special functions
struct Globals {

} G;

Die #include-Direktive bewirkt, dass der Inhalt der .h-Datei an dieser Stelle eingefügt wird. Das macht bereits der Compiler, nicht erst der Linker.
Überall da, wo Du main.h einbindest, wird eine globale Variable G definiert. Wird main.h in mehr als einer Datei referenziert, dann isses doppelt definiert.

Richtig:

main.h

// struct deklarieren
struct Globals {
 ...
};

// Hinweis an alle: irgendwo ist G als 'struct Global' definiert.
// Das reicht dem Compiler, 
// um die Auflösung kümmert sich der Linker.
extern struct Globals G;

main.c

#include "main.h"

// Hier ist das 'echte' G.
struct Global G;

main()
{
 ...
}

HTH und Gruß,
KHK

Vielen Dank! Es hat funktioniert.