2011-06-30 18 views
7

Recientemente he intentado compilar un programa en g ++ (en Ubuntu). Usualmente uso Dev-C++ (en Windows) y funciona bien siempre que haga un proyecto y coloque todos los archivos necesarios allí.Vinculación de archivos en g ++

El error que se produce cuando se compila el programa es:

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

Los archivos que se utilizan son los siguientes:

El código fuente (.cpp) Archivo con la función principal.

El archivo de encabezado con los prototipos de función.

El archivo .cpp con las definiciones para cada función.

Cualquier ayuda será apreciada.

+0

si pudiera publicar su código ..... será una ayuda ... –

+0

Dev-C++ es un IDE. Por defecto usa el puerto MinGW de GCC. –

Respuesta

17

Probablemente haya intentado compilar y vincular en lugar de solo compilar archivos fuente o de alguna manera haber olvidado algo.

Variación uno (todo en una línea; vuelve a compilar todo, todo el tiempo):

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

Variación de dos (paso a paso, y si no se proporciona ningún -o, gcc volverá a utilizar el nombre del archivo de entrada y sólo cambiar la extensión en caso de no vincular; esta variación se utiliza mejor para los archivos make; le permite omitir partes sin cambios):

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

variación tres (algunos marcadores de posición):

No lo mostrará, pero los parámetros mencionados anteriormente también podrían tener marcadores de posición, p. g++ -c *.cpp compilará todos los archivos cpp en el directorio actual en archivos o (bject) del mismo nombre.

En general, no debería preocuparse demasiado a menos que realmente tenga que trabajar sin ningún IDE. Si no eres tan competente con la sintaxis de la línea de comandos, primero usa los IDE.

2

La línea de comandos de gcc debe verse como:

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

Comprobar en qué archivo cpp la función miembro de la clase que falta se define. Puede que no se lo haya entregado a gcc.

0

También puede comprobar la correcta #include etiquetas dentro filename.cpp. Supongamos que filename.cpp usa el código contenido en myclass.h presente en el mismo directorio que filename.cpp. Suponga que la clase que g ++ dice que no está definida está contenida en myclass.h y se define en myclass.cpp.Por lo tanto, para incluir correctamente myclass.h dentro filename.cpp, haga lo siguiente:

  1. En filename.cpp:

#include <iostream>
#include <myclass.h>
..source code.

  1. En el 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

En lo anterior, tenga en cuenta el uso de -I. opción al compilar filename.cpp. El -I<directory> pregunta g++ para incluir la ruta siguiente a la parte -I en la ruta de búsqueda. De esa manera, myclass.h está incluido correctamente.

En ausencia de más información (tal vez la fuente), es difícil decir con exactitud dónde reside el problema. Todos los intentos serán solo puñaladas en la oscuridad.

0

que se supone que tiene declarada una función miembro (por lo general en un archivo .h o .hpp), pero ha omite, la definición correspondiente de la función miembro (por lo general en un archivo .cpp).

En ++ c, es posible declarar una clase de esta manera:

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

con un archivo CPP que va como así

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

Nota, no hay foo::y().

Esto no supone ningún problema para el proceso de compilación/vinculación, siempre que la función de miembro foo::y() no se haga referencia en ninguna parte del código compilado.