G++未定义x86_64架构的符号。

7

我正在学习C++,并接到了创建一个Vector3D类的任务。当我尝试在OSX上使用G++编译main.cpp时,出现了下面的错误信息。为什么会这样?

g++ main.cpp 
Undefined symbols for architecture x86_64:
  "Vector3DStack::Vector3DStack(double, double, double)", referenced from:
      _main in cc9dsPbh.o
ld: symbol(s) not found for architecture x86_64

main.cpp

#include <iostream>;
#include "Vector3DStack.h";

using namespace std;

int main() {
    double x, y, z;
    x = 1.0, y = 2.0, z = 3.0;
    Vector3DStack v (x, y, z);
    return 0;
}

Vector3DStack.h

class Vector3DStack {
public:
    Vector3DStack (double, double, double);

    double getX ();
    double getY ();
    double getZ ();

    double getMagnitude();

protected:
    double x, y, z;
};

Vector3DStack.cpp

#include <math.h>;
#include "Vector3DStack.h";

Vector3DStack::Vector3DStack (double a, double b, double c) {
    x = a;
    y = b;
    z = c;
}

double Vector3DStack::getX () {
    return x;
}

double Vector3DStack::getY () {
    return y;
}

double Vector3DStack::getZ () {
    return z;
}

double Vector3DStack::getMangitude () {
    return sqrt (pow (x, 2) * pow (y, 2) * pow (z, 2));
}

3
尝试删除包含语句后的分号。 - Abhishek Bansal
谢谢您的建议,但好像没有起作用? - user2406944
3个回答

24

你需要编译并链接你的Vector3DStack.cpp。尝试:

g++ main.cpp Vector3DStack.cpp -o vectortest

这将创建一个名为vectortest的可执行文件。


7
Vector3D的实现提交给编译器:
g++ main.cpp Vector3DStack.cpp

此命令将在Linux和Unix系统中生成名为a.out的可执行文件。若要更改可执行文件名称,请使用-o选项:

g++ -o my_program main.cpp Vector3DStack.cpp

这是构建程序的最简单方式。您应该学习更多-阅读有关make程序,甚至是cmake


4
我在编写自己的带模板哈希表实现时遇到了类似的问题。
在你的main.cpp中,只需包含“Vector3DStack.cpp”(该文件包含Vector3DStack.h),而不是仅包含Vector3DStack.h。
在我的情况下,由于我们知道模板是在编译时评估的,因此在cpp文件中作为类的一部分定义的模板化方法(包括完全专业化)需要被编译器知道。这是C++中的一些陷阱..要记住很多东西,容易忘记一些细节。
很可能你已经得到了我们的解决方案,感谢之前发布的答案,但我还是想说两句。
祝愉快的C ++编程!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接