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 に答える