0

大規模な C++ プロジェクトをコンパイルしようとすると、この奇妙なエラーが発生します。リンクエラーであることは知っていますが、それが何であるかを正確に理解できませんでした。


test_oqlquery.o:(.rodata._ZTV8r_MarrayIhE[vtable for r_Marray]+0x8): undefined reference to r_Marray<unsigned char>::~r_Marray()'
test_oqlquery.o:(.rodata._ZTV8r_MarrayIhE[vtable for r_Marray<unsigned char>]+0xc): undefined reference tor_Marray::~r_Marray()'
test_oqlquery.o:(.rodata._ZTV8r_MarrayIhE[vtable for r_Marray]+0x28): undefined reference to `r_Marray::print_status(std::basic_ostream >&) const'

このエラーはどういう意味ですか? また、エラーが発生している行番号を確認することはできますか? どのように ?私は主にこれが何を意味するのかに関心があります

".rodata._ZTV8r_MarrayIhE[r_Marray の vtable]+0x28"

実際、私のエラーはこのようなものですが、山括弧内のすべてが欠落している理由がわからないため、「」に置き換えてください。詳細なエラーは次のとおりです。テンプレートのインスタンス化にも関係しています。

test_oqlquery.o:(.rodata._ZTV8r_MarrayIhE[vtable for r_Marray"unsigned char"]+0x8): undefined reference to `r_Marray"unsigned char"::~r_Marray()'

g++ 4.3.3 を使用しています。

申し訳ありませんが、ソース コード全体は非常に大きく、複数のディレクトリにまたがっているため、ここに送信することはできません。

どうもありがとう。

4

3 に答える 3

6

まず、リンカ エラーとコンパイラ エラーは別物です。リンカーはソース ファイルではなくオブジェクト ファイルを処理するため、コンパイラ エラーには行番号がありますが、リンカー エラーにはありません。

次に、r_Marrayのデストラクタを宣言したものの、ビルドに含まれるどこにも実装していないようです。同じことがprint_statusにも当てはまります。

于 2009-07-23T13:27:35.270 に答える
4

r_Marray ::〜r_Marray()およびr_Marray :: print_statusを定義していないか、これらのメソッドを含むcppファイルがビルドプロセスの一部ではありませんでした。

これらのメソッドが定義されたcppファイルがある場合は、Makefileを投稿してください。

あなたの質問に対するあなたのコメントに基づいて、私はr_Marrayがテンプレート化されたクラスであると仮定していますか?ヘッダーファイルにr_Marrayメソッドの定義がありますか?

于 2009-07-23T13:24:07.740 に答える
2

これは通常、メソッドを宣言したが、その実装を提供していないか、リンクしていない場合に発生します。

たとえば、あなたは

class r_Marray {
public:
    ~r_Marray();
};

そして、ファイルr_Marray.cppでr_Marray ::〜r_Marray()の実装を提供するつもりでしたが、それを忘れました-正常にコンパイルされますが、表示されるエラーとはリンクしません。または、実装を提供しても、その実装を含むファイルをリンカーの入力に含めないこともできます。

于 2009-07-23T13:21:39.663 に答える