2016-09-24 5 views
0

Ich habe Fehler auf meinem Makefile-Code bekommen und ich habe keine Ahnung, wie es zu beheben, ich suchte die Website nach einer Antwort und endete damit, ein Konto zu erstellen um Hilfe zu fragen Hier ist der Fehlercodemehrere Definition von '_start'

date.o: In function `_start': 
(.text+0x0): multiple definition of `_start' 
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o:(.text+0x0): first defined here 
date.o: In function `_fini': 
(.fini+0x0): multiple definition of `_fini' 
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o (.fini+0x0): first defined here 
date.o:(.rodata+0x0): multiple definition of `_IO_stdin_used' 
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o (.rodata.cst4+0x0): first defined here 
date.o: In function `data_start': 
(.data+0x0): multiple definition of `__data_start' 
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o:(.data+0x0): first defined here 
date.o: In function `data_start': 
(.data+0x8): multiple definition of `__dso_handle' 
/usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o:(.data+0x0): first defined here 
date.o: In function `_init': 
(.init+0x0): multiple definition of `_init' 
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o (.init+0x0): first defined here 
/usr/lib/gcc/x86_64-linux-gnu/5/crtend.o:(.tm_clone_table+0x0): multiple definition of `__TMC_END__' 
date.o:(.data+0x10): first defined here 
/usr/bin/ld: error in date.o(.eh_frame); no .eh_frame_hdr table will be created. 
collect2: error: ld returned 1 exit status 
Makefile:3: recipe for target 'testdate' failed 
make: *** [testdate] Error 1 

und mein Make-Datei

testdate: date.o testdate.o 
     g++ -Wall -o testdate.o date.o 

date.o: date.h date.cpp 
     g++ -Wall -c date.cpp 
testdate.o: date.h testdate.cpp 
     g++ -Wall -c testdate.cpp 
+0

Es scheint so nicht zu Ihrem C++ Code zu makefile aber zusammenhängt, zu mir. – mertyildiran

+1

Der Befehl in Ihrer ersten Regel sieht falsch aus. Das Wort nach '-o' sollte der Name der Datei sein, die g ++ erstellen soll. – Beta

Antwort

2

die Regel

testdate: date.o testdate.o 
     g++ -Wall -o testdate.o date.o 

sollte

testdate: date.o testdate.o 
     g++ -Wall -o testdate testdate.o date.o 
#     ^^^^^^^^ 

oder sich selbst zu wiederholen zu vermeiden:

testdate: date.o testdate.o 
     g++ -Wall $^ -o [email protected] 

(dies sollte produzieren g++ -Wall date.o testdate.o -o testdate)

Tatsächlich könnte man in Erwägung ziehen:

testdate: date.o testdate.o 
     g++ -Wall $^ -o [email protected] 
date.o: date.cpp date.h 
    g++ -Wall -c $< -o [email protected] 
testdate.o: testdate.cpp date.h 
    g++ -Wall -c $< -o [email protected] 

$^ ist alles der Abhängigkeiten, $< ist ju st das erste und [email protected] ist das aktuelle Ziel.

Weitere Informationen über Makefile-Regeln: https://www.chemie.fu-berlin.de/chemnet/use/info/make/make_4.html

+0

Sie haben $^und $

+0

Ah, '$ @' ist das aktuelle Ziel, also in 'testdate: ...' '$ @' ist 'testdate'. – kfsone

+0

Ich habe es mit dem genauen Code ausprobiert, den Sie im dritten Beispiel gepostet haben, es gab immer noch denselben Fehler, gibt es eine Möglichkeit, das Makefile zu verhindern, das _start definiert –

Verwandte Themen