Problem mit Linker "defined in both module"
-
Hallo,
ich habe ein, für euch vielleicht, simples Problem, das ich aber momentan nicht gelöst bekomme. In der Hilfe/FAQ habe ich nichts gefunden.
In meiner Main.cpp inkludiere ich diverse Header in denen entweder Prototypen oder globale Variablen enthalten sind.
Zusätzlich zu meinem Programm habe ich noch einen Thread programmiert. Dieser soll auch auf die globalen Variablen zugreifen. Und das führt momentan zu Problemen.
// main.cpp #include main.h #include global.h #include thread.h global1 = 1; ...
// thread.cpp #include main.h #include global.h global1 = 2; ...
// globale variablen #ifndef BASIC_VARS_H #define BASIC_VARS_H double gobal1;
Mit dieser Implementierung kommt
[Linker Warning] Public symbol '_global1' defined in both module MAIN.OBJ and THREAD.OBJWie kann ich dem Thread den Zugriff auf den globalen Variablen ermöglichen?
Gruß
Krugman
-
Hallo
Dafür brauchst du das Schlüsselwort extern, mit dem du die Variable in der Headerdatei deklarierst. Die Definition der globalen Variablen muß dann so oder so in die cpp verschoben werden.
Im übrigen ein guter Anlaß, um zu überdenken, ob dein Konzept nicht auch ohne globale Variable auskommen würde.
bis bald
akari
-
Hi und danke für deine Antwort. Ich konnte die letzte Woche nicht anden PC und antworten.
Ich habe das mit dem extern "C" probiert, allerdings gibt es immernoch die Warningmeldung.
Ich habe zum Test im Hauptprogramm Werte zugewiesen und kann diese im Thread auswerten bzw. ändern. Kann es denn sein, das er mich nur darauf hinweisen möchte, das ich in beiden Programmen auf die gleichen Struktur zugreife und deshalb Fehler auftreten können?
Oder meint er, das dort zweimal die gleichen Strukturen definiert worden sind, aber unterschiedliche Addressen besitzen? *grübel*
Bin momentan ziemlich am schwimmen diesbezüglich. Allerdings bin ich auch nicht so fit mit Threads.
Viele Grüße
Krugman
-
Hallo,
schau dir mal diesen FAQ-Beitrag (aus dem C++ Subforum) dazu an: http://www.c-plusplus.net/forum/39477
-
Krugman schrieb:
Ich habe das mit dem extern "C" probiert, allerdings gibt es immernoch die Warningmeldung.
akari schrieb nur extern nicht extern "C". Das macht was anderes.
-
Hi,
nochmals vielen Dank für eure Antworten. Ich habe es verstanden.
Akari hatte erwähnt das Konzept nochmal zu überdenken. Allerdings frage ich mich gerade, wie ich das mit dem Thread anders machen soll? Im Prinzip gibt es dann noch das Problem, dass beide Prozesse auf eine Struktur zugreifen. Und im ungünstigesten Fall Schreiben/Lesen sie von der gleichen Variable. Das müsste dann doch zu einem Fehler führen?!
Wie kann ich die Struktur anders übergeben ohne das der Kompiler schreit? Und welche Methode hilft bezüglich der Zugriffsproblematik? Pipelining? Semaphoren? Sehr schwierig, da ich sowas noch nicht programmiert habe.
Gruß
Krugman
-
Hallo
Ob du nun externe globale Variablen oder Zeiger/Referenzen auf eine Member-Variable verwendest, ändert nichts daran das du bei Threads immer den Zugriff synchronisieren must. Welche Mechanismen du für deinen Fall einsetzen solltest, kommt sehr auf die genauen Details an. Im Zweifelsfall kannst du einfach die VCL-Klasse TCriticalSection einsetzen.
Und bei sochen Zugriffsproblemen zur Laufzeit hat auch der Compiler nichts mehr zu sagen. Da kommt es einfach nur noch zu undefinierten Verhalten, meistens in Form eines generischen Speicherfehlers.
bis bald
akari
-
Hallo,
mein Programm initialisiert bei Beginn die ganzen Strukturen. Ich habe diese anstatt global als 'shared memory' in meine beiden Prozesse integriert. Das führt im Prinzip auf das gleiche 'Warning' vom Compiler zurück, aber das ist momentan erstmal egal.
Schlussendlich dient der Thread zur Bearbeitung von Messwerten die über TCP/IP an mein Programm gesendet werden. Nachdem die Daten verarbeitet wurden, werden sie in meine Struktur und dem dafür vorgesehen Ringbuffer gespeichert.
Im Hauptprogramm soll für die ganzen Messwerte immer eine Art 'Vorschau' zu sehen sein. Bedeutet, ich will ab und zu mal einen Array der letzten Messwerte grafisch darstellen. Zur Darstellung des letzten empfangenen Arrays an Daten werde ich wohl noch einen zweiten Thread verwenden, der dann ab und zu was anzeigt.
Ich habe jetzt die 'Critical Section' folgendermaßen integriert:
// main.cpp Thread *TCalculaltion // Thread TCriticalSection *TBlocker // Thread Blocker // main.cpp - opning fcn TCalculation = new Thread(false); // suspended erstellen TBlocker = new TCriticalSection(); // thread.cpp extern TCriticalSection *TBlocker;
Soweit gibt es keine Fehler.
Danke nochmal allen für die Hilfe, bin natürlich offen für Kritik an Umsetzung oder ähnlichem.
Gruß
Krugman