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 中定义的,所以我有一个定义。
您看到的是链接器错误。链接是在编译后创建可执行文件的一个阶段。链接器的工作是获取对符号的所有引用,并将它们解析为对其定义的引用。
这意味着作为链接器的输入,您必须提供所有符号定义。其中一些来自库,一些来自.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
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文件链接到您的可执行文件。这就是您收到该错误的原因。
| 归档时间: |
|
| 查看次数: |
5834 次 |
| 最近记录: |