6

ヘッダーファイルに次のものがあります。

namespace silc{
   class pattern_token_map
   {
      /* Contents */
   };

   pattern_token_map* load_from_file(const char*);
}

CPP ファイル (これには適切なインクルードがあります)

pattern_token_map* load_from_file(const char* filename)
{
   // Implementation goes here
}

別の CPP ファイル。これにはすべての適切なインクルードがあります。

void some_method()
{
    const char* filename = "sample.xml";
    pattern_token_map* map = load_from_file( filename ); // Linker complains about this.
}

への参照が未定義であるというリンカ エラーが表示されload_from_fileます。ここで何が問題なのかわかりません。

どんな助けでも大歓迎です。

コンパイラ: G++ OS: Ubuntu 9.10

編集

使用したリンカー コマンドは次のとおりです。

g++ -L/home/nkn/silc-project/third_party/UnitTest++ -o tests.out  src/phonetic_kit/pattern_token_map.o  tests/pattern_token_map_tests.o  tests/main.o -lUnitTest++

エラーは からpattern_token_map_tests.oで、関数は で使用できますpattern_token_map.o。したがって、リンクの順序は問題ではないと思います。(コマンドを簡略化するために、コマンドからいくつかのファイルを削除しました)

4

2 に答える 2

9

実装するときは、正しい関数を実装していることを確認する必要があります。

namespace silc {
pattern_token_map* load_from_file(const char* filename) {
   // Implementation goes here
}
}

代わりにこれを行った場合:

using namespace silc; // to get pattern_token_map
pattern_token_map* load_from_file(const char* filename) {
   // Implementation goes here
}

次に、silc::load_from_file ではなく、新しい関数を定義します。

一般的なガイドラインとして、関数スコープ外でディレクティブ ("using namespace ...;") を使用しないでください。

using namespace silc; // outside function scope: avoid

silc::pattern_token_map*                      // qualify return type
random_function(silc::pattern_token_map* p) { // and parameters
  using namespace silc; // inside function scope: fine
  pattern_token_map* p2 = 0; // don't have to qualify inside the function
                             // if you want to use the using directive
  silc::pattern_token_map* p3 = 0; // but you can always do this
  return 0;
}
于 2010-01-17T17:56:45.900 に答える
0

リンク フェーズでは、最初の cpp ファイルをコンパイルして作成されたオブジェクト ファイルをリンクしていますか? このようなリンカ エラーは、1 つのオブジェクトが、リンクされているオブジェクトに含まれていないシンボルを参照している場合に発生します。

編集:私はまだこれが問題であると確信しています。最初のファイルに、load_from_file を再定義するプリプロセッサ シンボルがありますか?

于 2010-01-17T17:32:26.910 に答える