2017-09-05 5 views
0

EDIT: Eine Antwort wurde gefunden, und es war ein einfacher Fehler. Ich glaube nicht, dass dies ein Duplikat ist, weil ich weiß, was der Fehler anzeigt (dass die Hauptfunktion keinen Verweis auf die Objektklasse finden konnte). Ich dachte nur, dass ich es richtig eingefügt hätte und einen anderen Augensatz brauchte den Fehler in meiner Makefile-Zeile aus.g ++ kann nicht kompiliert werden, Cmake nicht

Ich entschuldige mich im Voraus, wenn ich die falsche Terminologie verwende, oder ich verstehe etwas Einfaches falsch. Ich bin etwas vertraut mit C und C# und das ist mein Versuch, C++ auszuprobieren. Es gibt andere Probleme im Code, z. B. die Benennung von Inkonsistenzen, aber ignorieren Sie diese, da sie nicht das Problem darstellen. Ich bin auch dabei, das Projekt umzustrukturieren/neu zu dokumentieren, bitte entschuldigen Sie das Chaos.

Was Ich habe

Ich habe vim mit einer kleinen C++ Anwendung zu schreiben und es wurde Kompilieren mit g ++. Es hat bis zu einem gewissen Punkt funktioniert. Der Fehler ergab keinen Sinn für mich, also entschied ich mich, Clion in einem Versuch zu versuchen, es zu debuggen, aber zu meiner Überraschung baute und lief es wie erwartet.

Vom Terminal, ich in das Projekt Stammverzeichnis bewegen (eine Ebene über src) und führen make:

g++ -c src/item.cpp -o obj/item.o 
g++ -c src/hero.cpp -o obj/hero.o 
g++ -c src/main.cpp -o obj/main.o 
g++ -o oChre.exe obj/hero.o obj/main.o -lm 
obj/main.o: In function `main': 
main.cpp:(.text+0x467): undefined reference to Hand::Hand(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)' 
main.cpp:(.text+0x49e): undefined reference to `Item::getName[abi:cxx11]()' 
collect2: error: ld returned 1 exit status 
makefile:7: recipe for target 'program' failed 
make: *** [program] Error 1 

Von innen Clion, ich klicken Sie einfach auf und Run Build- und die Projekt baut und läuft genau so, wie ich es erwarten würde.

Was ich vermute, ist die Frage

My Make-Datei ist wie folgt:

CC=g++ 
EXT=o 
PURGE=rm 

#The main bin 
program: item.o hero.$(EXT) main.$(EXT) 
    $(CC) -o oChre.exe obj/hero.$(EXT) obj/main.$(EXT) -lm 
main.o: 
    $(CC) -c src/main.cpp -o obj/main.o 

#Creatures 
hero.o: 
    $(CC) -c src/hero.cpp -o obj/hero.o 

#items 
item.o: 
    $(CC) -c src/item.cpp -o obj/item.o 

clean: 
    $(PURGE) obj/*.$(EXT) *.exe 

Ich vermute Clion ist mein Make-Datei nicht verwendet als IDE typischerweise in der Lage sind zu bestimmen, was zu zusammenstellen und auf ihre besitzen. Deshalb denke ich, dass Clion erfolgreich läuft.

Was wird mein Problem

Ich möchte lösen, wenn jemand eine oder beide der folgenden Fragen beantworten könnten:

  1. Warum g ++ nicht richtig kompilieren? Stimmt etwas mit meinem Makefile nicht oder ist der Compiler falsch konfiguriert? Ich gehe davon aus, dass sich dieses Projekt in Zukunft ausweiten wird, also lohnt es sich, mein eigenes Makefile zu pflegen oder sollte ich es einfach einer IDE überlassen.
  2. Warum kompiliert Clion meinen Code? Kann ich das generierte Makefile einfach in mein Repo laden, damit andere es kompilieren können?

Wenn ich etwas wichtiges vermisse, bitte fragen Sie oder ich habe den ganzen Code auf GitHub.

+1

Schreiben zuerst von Hand-Dateien machen ist eine gute Art und Weise zu verstehen, zu lernen, wie Kompilierung funktioniert. Dies kann beim Debuggen von Problemen beim Erstellen mit einer IDE/cmake hilfreich sein. Wenn Projekte groß werden CMake oder eine IDE ersparen Ihnen viel Arbeit bei der Pflege von Abhängigkeiten in Ihrem Makefile. CMake ist ziemlich populär für plattformübergreifenden Code, wobei die Autotools am häufigsten verwendet wurden, aber diese sind sehr schwer zu erlernen. – Eelke

+0

Mögliches Duplikat: [Was ist ein nicht definierter Verweis/ein ungelöster externer Symbolfehler und wie behebe ich ihn?] (Https://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-) symbol-error-and-how-do-i-fix) –

+0

Mögliches Duplikat von [Was ist ein undefinierter Verweis/ungelöster externer Symbolfehler und wie behebe ich ihn?] (https://stackoverflow.com/questions/12573816/ what-is-an-undefined-reference-unaufgelöst-external-symbol-error-and-how-do-i-fix) – Tsyvarev

Antwort

2

Ihr Linkbefehl fehlt Artikel.o

#The main bin 
program: item.o hero.$(EXT) main.$(EXT) 
    $(CC) -o oChre.exe obj/hero.$(EXT) obj/main.$(EXT) -lm 

sollte

#The main bin 
program: item.o hero.$(EXT) main.$(EXT) 
    $(CC) -o oChre.exe obj/item.o obj/hero.$(EXT) obj/main.$(EXT) -lm 
+0

Ich wusste, dass mir etwas Einfaches fehlte. Vielen Dank! –

Verwandte Themen