不幸的是我不能在这里发布所有的源代码。我可以描述一下这个结构。所有头文件都有#ifndef / #define / #endif guards。结构如下:
在全局命名空间的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
但果然,它在二进制文件中。如何重构我的代码以防止此链接问题?
答案 0 :(得分:3)
如果在.h
文件中声明正常函数,则会发生这种情况,因为它们将在#include
的每个文件中生成。也许您打算声明它inline
或static
?