4

我对 C++ 还是很陌生,所以如果这是一个简单的答案,我提前道歉。我正在尝试使用重载运算符。这是该运算符的签名:

const Vector3D operator/(const Vector3D& lhs, const double rhs)

这是我尝试使用它的方法:

OrthonormalBasis::OrthonormalBasis(const Vector3D &a)
{
    Vector3D t;
    w = a / a.length();
    t = getCollinearVector(w);

    //More code goes here
}

当我尝试编译时,g++ 返回以下错误:

/file/path/orthonormalBasis.cpp:8: undefined reference to 
`operator/(Vector3D const&, double)' 
collect2: ld returned 1 exit status

运算符是在 Vector3D.cpp 中定义的,所以我确实有一个定义。

4

2 回答 2

5

您看到的是链接器错误。链接是在编译后创建可执行文件的阶段。链接器的工作是获取对符号的所有引用并将它们解析为对其定义的引用。

这意味着作为链接器的输入,您必须提供所有符号定义。其中一些将来自库,一些来自.cpp文件。不幸的是,链接器实际上无法解析 C++。它希望编译器能够做到这一点。编译器生成一个.o文件。该.o文件包含解释符号定义和生成 CPU 可以直接执行的内容的结果。这就是链接器需要的那种定义。

通常将一个重要的程序(即一个具有多个.cpp文件的程序)编译为可执行文件涉及使用编译器创建一堆.o文件,然后将它们链接在一起成为一个可执行文件。

在您的情况下,您的符号在中定义Vector3D.cpp并用于orthonormalBasis.cpp. 我还可以从您g++在某种 Unix 平台上使用的错误中看出。编译和链接步骤至少如下所示:

g++ -c Vector3D.cpp
g++ -c orthoNormalBasis.cpp
g++ Vector3D.o orthoNormalBasis.o

我打赌你只是这样做:

g++ orthoNormalBasis.cpp

这是以下的简写:

g++ -c orthoNormalBasis.cpp
g++ orthoNormalBasis.o

正如您所看到的,即使尝试编译Vector3D.cpp更少尝试将生成的.o文件链接到您的可执行文件,这也完全错过了。这就是您收到该错误的原因。

于 2013-02-01T18:52:49.083 回答
3

主要是您只声明了重载operator/,没有定义它,因此链接器无法链接函数的定义。

于 2013-02-01T18:29:06.040 回答