Eignes Makfile
-
Hi,
ich versuche gerade mal selbst ein Makefile zu schreiben, nun bin ich auf ein Problem gestoßen und hoffe hier kann mir jemand weiter helfen.
Nun ich habe drei Dateien:
main.cpp
test.cpp
header.h"header.h" wird in "main.cpp" und "test.cpp" includet.
In "header.h" wird eine variable "int t" defefniert, nun mault logischerweise der Compiler beim zusammen führen von "main.o" und "test.o" das die Variable t redefeniert wird.Hier der Fehler:
g++ -o test main.o class.o
test.o(.bss+0x0): multiple definition of `t'
main.o(.bss+0x0): first defined hereHier mal die Code schnipsel:
Main.cpp
#include "header.h" int main(int argc,char *argv[]){ printf("hier 1"); printf(">> t = %i\n",t); }
Test.cpp
#include "header.h" class Test { public: Test(); void blub(); }; Test::Test(){ } void Test::blub(){ printf("blub"); } void test123(){ printf(">> %i\n",t); }
Header.h
#include <stdio.h> int t =0;
Und zum Schluss noch das Makefile:
CC = g++ CFLAGS = -Wall -o2 COMPILE = $(CC) $(CFLAGS) -c all: test test: main.o test.o $(CC) -o test main.o test.o main.o: main.cpp $(COMPILE) -o main.o main.cpp test.o: test.cpp $(COMPILE) -o test.o test.cpp clean: rm -f *.o
Ich hoffe mir kann jemand einen Tip geben.
-
wie wärs mit includeguards:
in die header:
#ifndef MY_HEADER_H #define MY_HEADER_H // hier kommt was bisher im Header stand #endif
Gruss, Gast25250
-
Hi,
danke für die schnell Antwort, nur ich bekomme immer noch den selben Fehler.
test.o(.bss+0x0): multiple definition of `t' main.o(.bss+0x0): first defined here
-
setcookie schrieb:
Hi,
danke für die schnell Antwort, nur ich bekomme immer noch den selben Fehler.
test.o(.bss+0x0): multiple definition of `t' main.o(.bss+0x0): first defined here
Ohne das jemand deinen Header kennt wird man darauf nicht antworten können
-
ach, da ist ja der header. Mach mal ein
make clean = rm *.o und versuchs dann nochmal
-
Ganzen oben steht meine "header.h" doch.
Ok hier noch mal ein wenig upgedatet:#ifndef MY_HEADER_H #define MY_HEADER_H #include <stdio.h> int t =0; #endif
-
Jedesmal wenn du die Header.h includierst, wird in der C++ Datei eine Variable mit dem Namen t angelegt. Du kannst aber im gesamten Programm nur eine globale Variable t haben.
Die Variable t muss in eine C++ Datei und in den Header sowas:
extern int t;
-
Danke für den Tip.
Funktioniert leider aber immer noch nicht:g++ -Wall -o2 -c -o main.o main.cpp
header.h:2: Warnung: »t« initialisiert und als »extern« deklariert
g++ -Wall -o2 -c -o test.o test.cpp
header.h:2: Warnung: »t« initialisiert und als »extern« deklariert
g++ -o test main.o class.o
test.o(.bss+0x0): multiple definition of `t'
main.o(.bss+0x0): first defined here
collect2: ld gab 1 als Ende-Status zurück
make: *** [test] Fehler 1
-
Initialisierung aus dem Header ins Cppfile!
-
Ahhhh ok... ich doof.
Ich bin ein schritt weiter:Es sieht jetzt so aus:
vars.h
extern int t;
header.h
#include <stdio.h>
main.cpp
#include "vars.h" #include "header.h" void test123(); int main(int argc,char *argv[]){ int t = 100; t = 200; test123(); t = 1; printf("main() >> t = %i\n",t); }
test.cpp
#include "header.h" int t; void test123(){ printf("test123() >> %i\n",t); }
Das ganze lässt sich nun auch kompilieren.
Wenn ich nun ein printf("%i",t); vor dem aufruf von test123() mache, bekomme ich auch den richtigen Wert bei test123() so bekomme ich aber 0.Danke schonmal im voraus!
-
das int t in der main-Funktion verdeckt das globale t und initialisiert es nicht!
Sprich das t was test123 sieht ist ein anderes als das was in deiner main-Funktion existiert.
-
Dieser Thread wurde von Moderator/in kingruedi aus dem Forum Linux/Unix in das Forum ANSI C verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
AHHHH ok ok... ich bin blöd.
Ich hab es Falsch rum gemacht, jetzt geht es.Also ich muss erst in meiner main.cpp das int t defenieren und in der anderen Datei mit extern int t wieder drauf zugreifen!
Danke vielmals für eure Hilfe!!!!
-
Btw, globale Variablen sind in etwa so out wie Brittney Spears
-
Btw, globale Variablen sind in etwa so out wie Brittney Spears
@Gast25250
Ich will diese Variable auch nur als debug flag nutzen.... wie würdest du es alternativ machen?
Ich bin immer für konstruktive Kritik zu haben.
-
setcookie schrieb:
Btw, globale Variablen sind in etwa so out wie Brittney Spears
@Gast25250
Ich will diese Variable auch nur als debug flag nutzen.... wie würdest du es alternativ machen?
Ich bin immer für konstruktive Kritik zu haben.na dann aber bitte "const" und sonst gibts für sowas nen Präprozessor, z.B. so:
int main() { #if WE_DO_DEBUG cerr << "we do debug"; #else cerr << "wo don't degug"; #endif }
compilieren mit -DWE_DO_DEBUG=1 oder mit -DWE_DO_DEBUG=0 und je nachdem gibt's diese oder jede Ausgabe.
-
Ok,
ich wollte es aber so machen das ich den debug nicht beim compilieren sondern beim aufruf des Programms aktviere, so aller verbose mode.
Ich dank dir aber für den Tip.