2011-04-28 13 views
5

I niedawno przeniesione do komputera Mac i zmagam użyciu kompilatorów wiersza poleceń. Używam g ++ do kompilacji, a to buduje pojedynczy plik źródłowy w porządku. gdy próbuję dodać niestandardowy plik nagłówka, gdy próbuję kompilować za pomocą g ++ uzyskać niezdefiniowane symbole dla architektury i386. Programy jednak kompilują dobrze w xCode. Czy brakuje mi czegoś oczywistego?niezdefiniowane symbole dla architektury i386:

próbował za pomocą g ++ -m32 main.cpp ... nie wiem co jeszcze spróbować.


OK, stary kod skompilowany ... Zawęziłem to do moich konstruktorów.

class Matrix{ 
public: 
    int a; 
    int deter; 

    Matrix(); 
    int det(); 
}; 

#include "matrix.h" 


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

int Matrix::det(){ 
    return 0; 

} 

mój błąd jest niezdefiniowane symbole dla architektury x86_64: "Matrix :: Matrix()", w odniesieniu od: _main w ccBWK2wB.o ld: Symbol (e) nie znaleziono dla architektury x86_64 collect2 : ld zwróconym 1 wyjście statusu

mój główny kod ma

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

    return 0; 
} 

wraz ze zwykłymi

+6

Rozważmy edycji pytanie zawierać kod, plik nagłówka, a wywołania linii poleceń. –

+0

i oczywiście odpowiednie wyjście;) – geekazoid

+0

Tylko po to, aby wyjaśnić, jakiej architektury próbujesz zbudować? Czy to jest x86_64? – Troubadour

Odpowiedz

7

Wygląda na to, że masz trzy pliki:

  • matrix.h, plik nagłówka, który deklaruje klasę Matrix;
  • matrix.cpp, kod źródłowy, który realizuje Matrix metod;
  • main.cpp, plik źródłowy, który definiuje main() i wykorzystuje klasę Matrix.

Aby utworzyć plik wykonywalny ze wszystkimi symbolami, należy skompilować oba pliki .cpp i połączyć je ze sobą.

Łatwym sposobem na to jest określenie ich obu w inwokacji g++ lub clang++. Na przykład:

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

lub, jeśli wolisz używać g++ - co Apple nie zostały zaktualizowane na jakiś czas, i wygląda na to, że nie będą w najbliższej przyszłości:

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

Idealny. Mój problem polegał na tym, że nie zawierałem obu moich plików źródłowych w mojej linii poleceń. Nie wiedziałem, że muszę to zrobić. Dzięki! – maccard

+0

Rozglądam się za tym rozwiązaniem. Dzięki. – Nate711

1

Czy rzeczywiście określić konstruktora Box gdzieś? (Jak Line.cpp)

+0

I brakuje ";" po deklaracji konstruktora. – RedX

+0

Konstruktor jest zdefiniowany. Kod kompiluje się w XCode. i nie, mają; na końcu tej linii jest to po prostu przepraszam za typ. – maccard

+1

i dodajesz Matrix.cpp również w linii poleceń, prawda? –

2

jest nie w tym przypadku, ale może się zdarzyć, aby być zapomnieć umieścić nazwę klasy z ::

na przykład:


dobry format:

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"); 
} 

złym formacie

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, ten zrobił to dla mnie .. Powiedziałbym, że nie wystarczy doświadczenia C++ z mojej strony. Myślałem, że problem był z Xcode. Ale nie, to był mój błąd. Będę ostrożny teraz. – 2am

+0

Doskonałe wyjaśnienie. Dzięki. –

Powiązane problemy