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

时间:2013-10-17 15:28:43

标签: c++ g++

我正在学习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 个答案:

答案 0 :(得分:22)

您还必须编译和链接Vector3DStack.cpp。尝试:

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

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

答案 1 :(得分:6)

Vector3D的实现传递给编译器:

g++ main.cpp Vector3DStack.cpp

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

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

这是构建程序的最简单方法。您应该多了解一下 - 阅读make计划,甚至是cmake

答案 2 :(得分:3)

在编写带有模板的hashTable实现时遇到了类似的问题。 在你的main.cpp中,只需要包含#34; Vector3DStack.cpp&#34;,它包含Vector3DStack.h,而不是只包含Vector3DStack.h。

就我而言,因为我们知道模板是在编译时进行评估的,所以在类中将模板化(包括完全专用)的方法作为cpp文件的一部分(定义它们的地方)需要为编译器所知。 。一些C ++陷阱......要记住这么多,容易忘记这些小事。

很可能你已经得到了我们的解决方案,这要归功于之前发布的答案,但我仍然是0.02美元。

快乐的C ++编程!