2009-06-01 8 views
0

私たちのアプリケーションは、いくつかの場所でC++テンプレートを利用しています。私は現在、gcc 3.3.3から4.1.0へ移植しようとしていますが、問題が発生しています。私は小さな共有ライブラリと実行可能ファイルで問題を再現しました。私は、[OK]を、共有ライブラリを構築していますが、実行可能ファイルは次のようにリンクに失敗する:gccからのポート3.3.3から4.1.0、C++のテンプレート、未定義の参照

undefined reference to `MyNumber<int>::~MyNumber()' 
    undefined reference to `MyNumber<int>::MyNumber(int)' 
    undefined reference to `MyNumber<int>::number()' 

が、私は実行可能ファイル内で直接テンプレートクラスを使用していないと、このすべてが内の実装内にカプセル化されると予想しているだろう共有ライブラリ(おそらく純粋にそうです)。

この問題は、共有ライブラリを使用している場合にのみ表示されます。私は、SLES 11(GCC 4.3.2)上の私たちのアプリケーションを構築するとき、私の問題のほとんどが解決されるように見えるが、私はまだ、次の数を受け取る:

undefined reference to `vtable for MYCLASS<T1, T2>' 

このすべての共有ライブラリへの実行可能ファイルをリンクするとき。

+0

コンパイラがあなたにすでに何を伝えているかを判断するのは難しいです。問題を最小限の期間に減らして投稿できますか? –

答えて

5

それは痛いほどあいまいなメッセージだが、それはあなたが、これは答えることは非常に困難であるソースコードの詳細を知らなくてもhere

0

を参照してください、仮想関数を定義していないことを意味します。しかし、この特定の質問をgcc mailing listにお願いすると、gccで作業する人々が他の誰よりも優れた複雑さをすべて知っているので、より良い結果が得られるかもしれません。

2

私は同様の問題があり、cppファイルではなく、ヘッダファイルに関数を実装することで解決しました。

Salu2。

0

コメントありがとうございます。コンパイル/リンクオプションから-frepoと-fno-impicit-templatesを削除して、うまくいきました。

+0

ところで、新しいコードを書くときにできるすべての警告フラグをオンにする価値があります。私は特に-Wall -Werror -pedanticが好きで、私が思うに、-ansi。私はこれにより、より良いコードを書かなければならなくなり、しばしば移植がずっと簡単になりました。 – ChrisInEdmonton

関連する問題