¿Por qué falla mi definición de clase C++?

main.cpp

#include <iostream>
#include "Burrito.h"

using namespace std;

int main(){
  Burrito b;
  return 0;
}

Burrito.h

#ifndef BURRITO_H
#define BURRITO_H

class Burrito{
    public:
      Burrito();
};

#endif

Burrito.cpp

#include "Burrito.h"
#include <iostream>

Burrito::Burrito(){

}

Compilar y vincular:

lzsb$ g++ main.cpp -o main
Undefined symbols for architecture x86_64:
  "Burrito::Burrito()", referenced from:
      _main in ccVpCr0z.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
lzsb$ 

Plataforma:

Mac OS 10.6.8

G++ : i686-apple-darwin10 --with-gxx-include-dir=/usr/include/c++/4.2.1

preguntado el 12 de junio de 12 a las 09:06

2 Respuestas

Necesitas compilar el Burrito.cpp archivo también. El compilador crea archivos de objetos a partir de cada archivo .cpp y los vincula después. Aquí es donde falla su llamada, porque el enlazador no puede encontrar el referenciado Burrito clase en cualquiera de sus archivos de objetos. Para arreglar su llamada al compilador simplemente agregue Burrito.cpp

g++ main.cpp Burrito.cpp -o main

respondido 13 mar '16, 13:03

Thx, pero si tengo muchos archivos cpp, sería estúpido agregarlos todos. Entonces, ¿cómo manejarlo normalmente cuando hay muchos archivos fuente? - WoooHaaaa

@MrROY Depende de cómo prefiera trabajar. Si está utilizando un IDE como XCode (ya que está en OSX) o Eclipse o Kdevelop, estos IDE le brindan la posibilidad de administrar las llamadas del compilador. Si prefiere trabajar con un editor simple, le recomendaría que use un Makefile (Make ya está instalado en OSX si tiene las herramientas de compilación). Vea aquí un Makefile de ejemplo, que compila todas las fuentes .cpp en un directorio: stackoverflow.com/a/9789115/991425 . Luego, todo lo que tiene que hacer es llamar a make en la línea de comandos en el directorio con las fuentes y el Makefile. - Haatschii

Su línea de compilación debe ser:

g++ Burrito.cpp principal.cpp -o principal

Respondido el 12 de junio de 12 a las 09:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.