2011-03-05 81 views
1

不幸的是我不能在這裏發佈所有的源代碼。我可以描述結構。所有頭文件都有#ifndef/#define/#endif保護。的結構如下:C++連接問題:多重定義

  • 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 

果然,雖然,它是二進制文件。我如何重構我的代碼以防止此鏈接問題?

回答

2

如果您在.h文件中聲明瞭正常函數,則會發生這種情況,因爲它們將在每個文件中生成,這些文件將在#include之前生成。也許你打算申報inlinestatic