2011-04-28 23 views
5

Recientemente me mudé a un mac, y estoy luchando con los compiladores de línea de comandos. Estoy usando g ++ para compilar, y esto construye un solo archivo fuente bien. si trato de agregar un archivo de encabezado personalizado, cuando intento compilar usando g ++ obtengo símbolos no definidos para la arquitectura i386. Sin embargo, los programas compilan bien en xCode. ¿Me estoy perdiendo algo obvio?Símbolos no definidos para la arquitectura i386:

intenté usar g ++ -m32 main.cpp ... no sabía qué más probar.


Bien, El código antiguo compilado ... Lo he reducido a mis constructores.

class Matrix{ 
public: 
    int a; 
    int deter; 

    Matrix(); 
    int det(); 
}; 

#include "matrix.h" 


Matrix::Matrix(){ 
    a = 0; 
    deter = 0; 
} 

int Matrix::det(){ 
    return 0; 

} 

mi error es símbolos no definidos para la arquitectura x86_64: "Matrix :: Matrix()", se hace referencia a partir de: _main en ccBWK2wB.o ld: símbolo (s) que no se encuentran en la arquitectura x86_64 collect2 : ld devolvió 1 estado de salida

mi código principal tiene

#include "matrix.h" 
int main(){ 
    Matrix m; 

    return 0; 
} 

junto con la habitual

+6

Considere la edición de su pregunta para incluir su código, archivo de cabecera, y invocaciones de línea de comando. –

+0

y, por supuesto, la salida correspondiente;) – geekazoid

+0

Para que quede claro, ¿para qué arquitectura está tratando de construir? ¿Es x86_64? – Troubadour

Respuesta

7

Parece que tienes tres archivos:

  • matrix.h, un archivo de cabecera que declara la clase Matrix;
  • matrix.cpp, un archivo fuente que implementa los métodos Matrix;
  • main.cpp, un archivo fuente que define main() y utiliza la clase Matrix.

Para producir un archivo ejecutable con todos los símbolos, debe compilar ambos archivos .cpp y vincularlos.

Una manera fácil de hacerlo es especificarlos en su invocación g++ o . Por ejemplo:

clang++ matrix.cpp main.cpp -o programName 

o, si se prefiere utilizar g++ - la cual Apple no han actualizado en un tiempo, y parece que no van en el futuro previsible:

g++ matrix.cpp main.cpp -o programName 
+0

Perfecto. Mi problema era que no estaba incluyendo mis dos archivos fuente en mi línea de comando. No me di cuenta de que tenía que hacer eso. Gracias! – maccard

+0

He estado buscando esta solución. Gracias. – Nate711

1

¿De verdad definiste el constructor de Box en alguna parte? (Como Line.cpp)

+0

Y le falta un ';' después de la declaración del constructor. – RedX

+0

Constructor está definido. El código se compila en XCode. y no, tener a; al final de esa línea, es solo un tipo, lo siento. – maccard

+1

y también está incluyendo Matrix.cpp en la línea de comandos, ¿verdad? –

2

es no es el caso aquí, pero puede darse el caso de ser la que se olvide de poner el nombre de la clase con ::

por ejemplo:


un buen formato:

foo.h

class Foo{ 
public: 
    Foo(); 
    void say(); 
private: 
    int x; 
}; 

foo.CPP

Foo::Foo(){ 
    this->x = 1; 
} 

void Foo::say(){ 
    printf("I said!\n"); 
} 

un mal formato

foo.h

class Foo{ 
public: 
    Foo(); 
    void say(); 
private: 
    int x; 
} 

foo.cpp

Foo::Foo(){ 
    this->x = 1; 
} 

//I always mistake here because I forget to put the class name with :: and the xcode don't show this error. 
void say(){ 
    printf("I said!\n"); 
} 
+0

wow, este lo hizo por mí .. Diría que no tengo suficiente experiencia en C++ por mi parte. Pensé que el problema era con Xcode. Pero no, fue mi error. Tendrás cuidado ahora. – 2am

+0

Explicación perfecta. Gracias. –

Cuestiones relacionadas