2011-09-16 15 views
-1

私はUbuntuの下でC++で共有ライブラリを作成しています。ソースコードには、ClassA.hとClassA.cppの2つのファイルが含まれています。シンボルルックアップエラー

ClassA.h:

namespace calss_a{ 
class ClassA{ 
public: 
    ... 
    void foo(int nBlockIndex); 
    ... 
} 
} 

ClassA.h:

namespace calss_a{ 
    ... 
    void classA::foo(int nBlockIndex){printf("....");} 
    ... 
} 

上記ソースコードからファイルとしてTEST.CPPに使用される.SOコンパイルベローズコンテンツの一部であります

... 
class_a::ClassA * ptr = new class_a::ClassA(); 
... 
ptr->foo(0); 
... 

ただし、test.cppの実行可能ビルドを実行すると、次のようなエラーが発生します。

シンボル検索エラー:/ホーム/ hzhu /テスト:未定義のシンボル:_ZN16class_a15ClassA16fooEj

しかし、私はint型「からの引数 "nBlockIndex"()ClassA.cppとClassA.hにFOOの種類を変更した場合"を" unsigned in "に変更し、.soファイルを再コンパイルすると、問題は消えます。さらなる実験では、引数「nBlockIndex」のタイプは、まだ 『int型』になるように定義されていますが、TEST.CPPに、私は 『foo』というこの方法を呼び出す:

ptr->foo(1); //pass 1 instead of 0 

その後、問題が同様に消えます。

ここで何が起こっているのか誰にでも教えてください。

ありがとうございました。

+1

を定義している場所を見つけるだろう。 –

+0

"_ZN16class_a15ClassA16fooEj"のデアンギュラフォームを投稿できますか? (私のGNU C++ filtはデマングルすることができません)また、実行ファイル内の未定義のシンボルをチェックできますか?このエラーが発生すると、私は通常、期待されているシンボル(アンマングルバージョン)と提供されているシンボルを見つけます。 .soと実行ファイルのnmを実行すると、この情報を得ることができます。 – Kashyap

+1

同じタイプミスが2番目のスニペットにもあります。 –

答えて

0

私はこの種のことに少し新しくなっていますが、シンボル検索のエラーに遭遇していますので、私が見つけたものを分かち合うと思いました。

シンボルルックアップエラーの問題は、通常、何かが2つの異なる場所で2つの異なる方法で定義されていることです。 `代わりclass_a``のcalss_a`を:あなたは

nm -u your-executable | grep undefined-symbol 

を行うなら、あなたはあなたがあなたの最初のスニペットでスペルの間違いを持っ​​ているオブジェクトファイルまたは実行可能ファイルで使用されているシンボルが