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:
- 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.
- 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.
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
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) –
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