2017-09-05 4 views
0

EDIT: Une réponse a été trouvée, et ce fut une simple erreur. Je ne pense pas que ce soit un doublon car je sais ce que l'erreur indique (que la fonction principale était incapable de trouver une référence à la classe d'objets), je pensais juste l'avoir correctement incluse et j'avais besoin d'un autre ensemble d'yeux sur l'erreur dans ma ligne makefile. Je m'excuse d'avance si j'utilise la mauvaise terminologie, ou si je ne comprends pas quelque chose de simple. Je suis un peu familier avec C et C# et c'est ma tentative d'essayer C++. Il y a d'autres problèmes dans le code, tels que les incohérences de nommage, mais veuillez les ignorer car ils ne sont pas la question à portée de main. Je suis également en train de restructurer/redocumenter le projet, alors excusez le désordre.g ++ ne parvient pas à compiler, Cmake ne pas

Ce que j'ai

J'ai écrit une petite application C++ en utilisant vim et compilent à l'aide g ++. Cela a fonctionné jusqu'à un certain point. L'erreur n'a pas de sens pour moi, donc j'ai décidé d'essayer Clion dans une tentative de débogage, mais, à ma grande surprise, il a construit et a couru comme prévu.

A partir du terminal, je propose dans le répertoire racine du projet (un niveau au-dessus src) et exécutez 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 

De l'intérieur Clion, je viens de cliquer sur Construire et Run et Le projet construit et fonctionne exactement comme je le souhaiterais.

Ce que je Suspect Le problème est-

Mon makefile est la suivante:

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 

Je soupçonne que Clion n'utilise pas mon makefile comme IDE sont généralement capables de déterminer ce qu'il faut compiler et comment leur posséder. C'est pourquoi je pense que Clion fonctionne avec succès.

Que se résoudre mon problème

Je voudrais si quelqu'un pourrait répondre à une ou deux questions suivantes:

  1. Pourquoi ne pas g ++ compiler correctement? Y a-t-il un problème avec mon makefile ou mon compilateur est-il mal configuré? Je m'attends à ce que ce projet se développe dans le futur, donc cela vaudra la peine de maintenir mon propre makefile ou devrais-je laisser cela à un IDE?
  2. Pourquoi Clion compile-t-il mon code? Est-ce que je peux juste obtenir le makefile qu'il génère et le mettre dans mon repo pour que d'autres puissent le compiler?

S'il me manque quelque chose d'important, s'il vous plaît demander ou j'ai tout le code sur GitHub.

+1

écriture font fichiers d'abord à la main est une bonne façon d'apprendre à comprendre comment fonctionne la compilation. Ce qui peut être utile lors du débogage de problèmes lors de la construction avec un IDE/cmake. Lorsque les projets deviennent grands, CMake ou un IDE vous épargnera beaucoup de travail en gérant les dépendances dans votre fichier makefile. CMake est assez populaire pour le code multi-plateforme auparavant les autotools étaient utilisés le plus souvent mais ils sont très difficiles à apprendre. – Eelke

+0

Possible duplicate: [Qu'est-ce qu'une erreur de symbole externe non résolue/non résolue et comment la réparer?] (Https://stackoverflow.com/questions/12573816/what-is-undefined-reference-unresolved-external- erreur-symbole-et-comment-faire-je-fix) –

+0

Copie possible de [Qu'est-ce qu'une erreur de symbole externe non résolue de référence/non résolue et comment la réparer?] (https://stackoverflow.com/questions/12573816/ what-is-an-undefined-reference-non-résolu-external-symbol-error-and-how-do-i-fix) – Tsyvarev

Répondre

2

Votre commande de lien est un élément manquant.o

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

devrait être

#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

Je savais qu'il me manquait quelque chose de simple. Je vous remercie! –