架构i386的未定义符号:

时间:2011-04-28 12:02:19

标签: c++ macos linker g++ terminal

我最近搬到了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 in ccBWK2wB.o ld:找不到架构x86_64的符号 collect2:ld返回1退出状态

我的主要代码有

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

    return 0;
} 

与通常的

一起

3 个答案:

答案 0 :(得分:7)

看起来你有三个文件:

  • 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

答案 1 :(得分:2)

不是这里的情况,但可能恰好是你忘了把类名用::

例如:


良好的格式:

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

答案 2 :(得分:1)

你真的在某处定义了Box构造函数吗? (比如Line.cpp)