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

Posted

技术标签:

【中文标题】C++ 链接问题:多重定义【英文标题】:C++ linking issue: multiple definition 【发布时间】:2011-03-05 00:26:53 【问题描述】:

很遗憾,我无法在此处发布所有源代码。我可以描述结构。所有头文件都有#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()); 

(注意:如下所示,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】:

如果您在.h 文件中声明普通函数,就会发生这种情况,因为它们将在#includes 的每个文件中生成。也许您的意思是声明它inlinestatic

【讨论】:

以上是关于C++ 链接问题:多重定义的主要内容,如果未能解决你的问题,请参考以下文章

gcc:在 C++ 应用程序中链接 C 库会导致“多重定义”错误

[debug] 解决在C++编写过程中的“找到一个或多个多重定义的符号”

Blazor WASM 页面路由

C++ 链接错误与 Linux 上的多个定义

C++类定义中函数的多重定义

C++ 中的多个类定义错误,我的头文件有问题吗?