1

残念ながら、ここにすべてのソースコードを投稿することはできません。構造は説明できますが。すべてのヘッダーファイルには、#ifndef /#define /#endifガードがあります。構造は次のとおりです。

  • node.h-tree.hに含まれています
  • tree.h-tree.cppおよびmain.cppに含まれています
  • tree.cpp
  • main.cpp

グローバル名前空間のnode.hで、次の独立した関数を宣言します。

bool char_sort_func(Path first, Path second)
{
  return (first->label() < second->label()); 
}

(注:以下に示すように、パスは単なるshared_ptrです)ビルドしようとすると、関数がtree.oとmain.oの両方に存在するという複数の定義エラーが発生します。

> make
g++ -c -g -Wall main.cpp -I /usr/include
g++ -c -g -Wall tree.cpp  -I /usr/include
g++ -Wall -o tool tree.o main.o -L /usr/lib -l boost_program_options
main.o: In function `char_sort_func(boost::shared_ptr<Edge>, boost::shared_ptr<Edge>)':
node.h:70: multiple definition of `char_sort_func(boost::shared_ptr<Edge>, boost::shared_ptr<Edge>)'
tree.o:node.h:70: first defined here
collect2: ld returned 1 exit status
make: *** [all] Error 1

すべてのソースファイルを検索して、それが正しいかどうかを確認しようとしましたが、間違った場所には表示されません。

> grep char_sort_func *
Binary file main.o matches   
node.h:bool char_sort_func(Path first, Path second) 
node.h:    std::sort(edges_.begin(), edges_.end(), char_sort_func);
Binary file trie.o matches

案の定、それはバイナリファイルにあります。このリンクの問題を防ぐためにコードを再構築するにはどうすればよいですか?

4

1 に答える 1

3

これは、ファイルで通常の関数を宣言した場合に発生します。これは、通常の関数がそれを含む.hすべてのファイルで生成されるため#includeです。おそらくあなたはそれを宣言するつもりでしたinlinestatic

于 2011-03-05T00:34:54.127 に答える