C++ - 链接器找不到我的函数,这恰好是一个重载的运算符

Mr *_*nes 4 c++ linker constants operator-overloading pass-by-reference

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

const Vector3D operator/(const Vector3D& lhs, const double rhs)
Run Code Online (Sandbox Code Playgroud)

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

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

    //More code goes here
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Omn*_*ous 5

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

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

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

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

g++ -c Vector3D.cpp
g++ -c orthoNormalBasis.cpp
g++ Vector3D.o orthoNormalBasis.o
Run Code Online (Sandbox Code Playgroud)

我打赌你只是这样做:

g++ orthoNormalBasis.cpp
Run Code Online (Sandbox Code Playgroud)

这是以下的简写:

g++ -c orthoNormalBasis.cpp
g++ orthoNormalBasis.o
Run Code Online (Sandbox Code Playgroud)

如您所见,这完全错过了甚至尝试编译Vector3D.cpp更少的尝试将结果.o文件链接到您的可执行文件。这就是您收到该错误的原因。