web-dev-qa-db-fra.com

Lier des fichiers dans g ++

Récemment, j'ai essayé de compiler un programme en g ++ (sur Ubuntu). Habituellement, j'utilise Dev-C++ (sous Windows) et cela fonctionne bien tant que je crée un projet et y mets tous les fichiers nécessaires.

L'erreur qui se produit lors de la compilation du programme est:

$filename.cpp: undefined reference to '[Class]::[Class Member Function]'

Les fichiers utilisés sont les suivants:

Le fichier de code source (.cpp) avec la fonction principale.

Le fichier d'en-tête avec les prototypes de fonction.

Le fichier .cpp avec les définitions de chaque fonction.

Toute aide serait appréciée.

13
E.O.

Vous avez probablement essayé de compiler et de lier au lieu de simplement compiler des fichiers sources ou vous avez oublié quelque chose.

Variante 1 (tout sur une seule ligne; recompile tout tout le temps):

g++ -o myexecutable first.cpp second.cpp third.cpp [other dependencies, e.g. -Lboost, -LGL, -LSDL, etc.]

Variante deux (étape par étape; si non -o est fourni, gcc réutilisera le nom du fichier d'entrée et changera simplement l'extension lorsqu'il n'est pas lié; cette variante est mieux utilisée pour les makefiles; vous permet de sauter des parties inchangées):

g++ -c first.cpp
g++ -c second.cpp
g++ -c third.cpp
g++ -o myexecutable first.o second.o third.o [other dependencies]

Variante trois (quelques espaces réservés):

Je ne le listerai pas, mais les paramètres mentionnés ci-dessus pourraient tout aussi bien avoir des espaces réservés, par exemple g++ -c *.cpp compilera tous les fichiers cpp du répertoire courant vers o(bject) fichiers du même nom.

Dans l'ensemble, vous ne devriez pas trop vous en soucier à moins que vous ne deviez vraiment travailler sans IDE. Si vous n'êtes pas très compétent avec la syntaxe de la ligne de commande, tenez-vous d'abord aux IDE.

26
Mario

La ligne de commande de gcc devrait ressembler à:

g++ -o myprogram class1.cpp class2.cpp class3.cpp main.cpp

Vérifiez dans quel fichier cpp la fonction membre de classe manquante est définie. Vous ne l'avez peut-être pas donné à gcc.

2
Rémi

Vous pouvez également vérifier si #include balises dans filename.cpp. Suppose que filename.cpp utilise le code contenu dans myclass.h présent dans le même répertoire que filename.cpp. Supposons que la classe que g ++ dit non définie est contenue dans myclass.h et défini dans myclass.cpp. Donc, pour inclure correctement myclass.h dans filename.cpp, procédez comme suit:

  1. Dans filename.cpp:
#include <iostream>  
#include <myclass.h>  
//..source code.  
  1. Dans le makefile:
filename.o: myclass.C myclass.h filename.cpp
g++ -I./ -c filename.cpp -o filename.o

myclass.o: myclass.C myclass.h  
g++ -c myclass.C -o myclass.o

Dans ce qui précède, notez l'utilisation de -I. option lors de la compilation filename.cpp. Le -I<directory> demande g++ pour inclure le chemin suivant le -I partie dans le chemin de recherche. De cette façon myclass.h est correctement inclus.

En l'absence de plus d'informations (la source peut-être), il est difficile de dire avec précision où se situe le problème. Toutes les tentatives ne seront que des coups de couteau dans le noir.

0
Sriram

Je suppose que vous avez déclaré une fonction membre (généralement dans un fichier .h Ou .hpp) Mais que vous avez omis la définition respective de la fonction membre (généralement dans un fichier .cpp) .

En c ++, il est possible de déclarer une classe comme ceci:

class foo {
  void x();
  void y();
}

avec un fichier cpp qui va comme ça

void foo::x() {
   do_something()
}

Notez qu'il n'y a pas de foo::y().

Cela ne pose aucun problème au processus de compilation/liaison tant que la fonction membre foo::y() n'est référencée nulle part dans le code compilé.

0
René Nyffenegger