7

I am learning C++ and have been given an assignment to create a Vector3D class. When I try to compile main.cpp using G++ on OSX I get the following error message. Why would this be?

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

3 回答 3

23

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

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

这应该创建一个名为vectortest.

于 2013-10-17T15:32:38.553 回答
7

将实现传递Vector3D给编译器:

g++ main.cpp Vector3DStack.cpp

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

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

这是构建程序的最简单方法。您应该了解更多信息——阅读有关make程序甚至cmake的信息。

于 2013-10-17T15:32:58.050 回答
4

在使用模板编写自己的 hashTable 实现时,我遇到了类似的问题。在您的 main.cpp 中,只包括“Vector3DStack.cpp”,其中包括 Vector3DStack.h,而不是只包括 Vector3DStack.h。

在我的例子中,由于我们知道模板是在编译时评估的,因此编译器需要知道类中的模板化(包括完全专用)方法作为 cpp 文件(定义它们的位置)的一部分。一些 C++ 陷阱.. 要记住的东西太多了,小事很容易忘记。

很可能您已经得到了我们的解决方案,这要归功于之前发布的答案,但无论如何我的 0.02 美元。

快乐的 C++ 编程!

于 2013-12-07T17:26:47.060 回答