C ++链接问题:多重定义

时间:2011-03-05 00:26:53

标签: g++ linker-errors multiple-definition-error

不幸的是我不能在这里发布所有的源代码。我可以描述一下这个结构。所有头文件都有#ifndef / #define / #endif guards。结构如下:

  • 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()); 
}

(注意:如下所示,Path只是一个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

但果然,它在二进制文件中。如何重构我的代码以防止此链接问题?

1 个答案:

答案 0 :(得分:3)

如果在.h文件中声明正常函数,则会发生这种情况,因为它们将在#include的每个文件中生成。也许您打算声明它inlinestatic