... undefined reference to ... collect2: ld a retourné 1 code de sortie
J'ai les 3 fichiers suivants:
erreur.h
#ifndef error_h
#define error_h
#include <string>
#include <iostream>
#include <cstdio>
void Error(std::string msg);
#endif
error.cpp
#ifdef error_h
#include "error.h"
void Error(std::string msg)
{
std::cerr
<< "\n=========================================================\n"
<< msg
<< "\n=========================================================\n";
exit(EXIT_FAILURE);
}
#endif
foobar.cpp
#include "error.h"
int main()
{
for(int i=0; i<99; i++)
if(i==55)
Error("this works");
return 0;
}
Maintenant, je n':
$ g++ -c error.cpp foobar.cpp
$ g++ error.o foobar.o -o exampleprogram
Et j'obtiens:
foobar.o: In function `main':
foobar.cpp:(.text+0x4b): undefined reference to `Error(std::basic_string<char,
std::char_traits<char>, std::allocator<char> >)'
collect2: ld returned 1 exit status
Ce que je fais mal? De quoi ai-je besoin de comprendre pour résoudre ce problème, et d'autres problèmes similaires à l'avenir sans se poser de questions? Merci!
maintenant je me rends compte que exit(int) est en cstdlib et pas dans cstdio
OriginalL'auteur user1358 | 2012-08-05
Vous devez vous connecter pour publier un commentaire.
Pourquoi avez-vous ces lignes dans error.cpp?
Depuis le symbole de préprocesseur
error_h
n'est pas défini l'ensemble du contenu de error.cpp sont omis par le préprocesseur. Supprimer ces lignes et de votre programme de liaison avec succès.Vous semblez avoir un malentendu comment (et pourquoi)
#include
gardes doivent être utilisés. Reportez-vous à cette réponse pour une explication.Aussi, il n'y a pas besoin d'inclure iostream et cstdio dans erreur.h, étant donné que le fichier est de ne pas utiliser quoi que ce soit déclaré dans l'un de ces en-têtes. Ces fichiers doivent être inclus dans error.cpp.
La meilleure pratique consiste à inclure uniquement les en-têtes qui sont nécessaires dans ce fichier, donc oui, inclut tendance à être dispersés. Il n'y a rien d'incorrect à propos de y compris les en-têtes d'erreur.h, mais lorsque vous incluez d'erreur.h main.cpp, le préprocesseur va inclure les fichiers dans l'unité de traduction créé à partir de main.cpp et le compilateur à traiter de ces en-têtes. Pas vraiment un sujet de préoccupation dans de petits projets, mais pour les grands projets, cela peut influencer considérablement les temps de construire.
Vos explications m'a beaucoup aidé. Je vous remercie beaucoup.
OriginalL'auteur Praetorian
error_h
n'est pas défini dans error.cpp, de sorte que tous vos fichier le contenu des #ifdef serais loin.En essence, vous êtes à la compilation error.cpp comme un fichier vide.
OriginalL'auteur Joachim Isaksson
Supprimer cette
et le correspondant
#endif
deerror.cpp
. Sinon, ici:error.cpp
est essentiellement vide. C'est parce que, à ce stade,error_h
n'est pas défini. Si vous n'êtes pas de la compilation de la mise en œuvre (travail si vous avez incluserror.h
avant la#ifdef
, mais il n'y a aucune raison pour que, dans le.cpp
fichier de toute façon).OriginalL'auteur juanchopanza