Неопределенные символы для архитектуры i386: - PullRequest
5 голосов
/ 28 апреля 2011

Я недавно перешел на Mac и пытаюсь использовать компиляторы командной строки. Я использую g ++ для компиляции, и это прекрасно создает один исходный файл. если я пытаюсь добавить собственный заголовочный файл, когда я пытаюсь скомпилировать с использованием g ++, я получаю неопределенные символы для архитектуры i386. Программы прекрасно компилируются в xCode. Я что-то упускаю из виду?

пытался использовать g ++ -m32 main.cpp ... не знал, что еще попробовать.


Хорошо, старый код скомпилирован ... Сузили его до моих конструкторов.

class Matrix{
public:
    int a;
    int deter;

    Matrix();
    int det();
};

#include "matrix.h"


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

int Matrix::det(){
    return 0;

}

моя ошибка Неопределенные символы для архитектуры x86_64: "Matrix :: Matrix ()", на которую ссылаются из: _main в ccBWK2wB.o ld: символы не найдены для архитектуры x86_64 collect2: ld вернул 1 статус выхода

мой основной код имеет

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

    return 0;
} 

вместе с обычным

Ответы [ 3 ]

7 голосов
/ 29 апреля 2011

Похоже, у вас есть три файла:

  • matrix.h, файл заголовка, который объявляет класс Matrix;
  • matrix.cpp, исходный файлкоторый реализует Matrix методы;
  • main.cpp, исходный файл, который определяет main() и использует класс Matrix.

Для создания исполняемого файла со всемисимволов, вам необходимо скомпилировать оба файла .cpp и связать их вместе.

Простой способ сделать это - указать их оба в вызове g++ или clang++.Например:

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

или, если вы предпочитаете использовать g++, которые Apple не обновляла в течение некоторого времени, и похоже, что они не появятся в обозримом будущем:

g++ matrix.cpp main.cpp -o programName
2 голосов
/ 08 ноября 2012

здесь не так, но может случиться так, что вы забудете указать имя класса с помощью: *

, например:


хороший формат:

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

плохой формат

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");
}
1 голос
/ 28 апреля 2011

Вы где-то определяли конструктор Box?(например, Line.cpp)

...