链接阶段的多重定义错误

Posted

技术标签:

【中文标题】链接阶段的多重定义错误【英文标题】:Multiple definition error at the linking stage 【发布时间】:2020-02-09 14:53:11 【问题描述】:

如果我的项目由两个翻译单元a.cppb.cpp组成,并且有h.cpp有一个功能定义。在这种情况下,每个 .cpp 文件都会被成功编译,但在链接阶段我们会得到多个定义。为避免这种情况(如果您不将定义放在单独的 .cpp 文件中),您可以制作此函数

    内联 静态 静态内联 用空的命名空间包围它

谁能解释这四种方法的区别,哪个更好用。而如果是模板函数会怎样,会不会有什么问题?

【问题讨论】:

当您包含包含函数定义的头文件时,您考虑的所有选项在特殊情况下都很有用。通常你只在标题中保留声明,并将它们包含在 cpp 文件中,并将定义保留在 cpp 文件之一或单独的 cpp 文件中。 【参考方案1】:

这些是对您的前 3 个声明的有用解释:

    inline static static inline

第四个选项是在某些情况下需要研究的特殊情况。

如果是模板,您必须记住所有函数都必须在同一个文件中定义,通常是.h.hpp。如果您想将定义与实现分开,请记住在定义函数的文件末尾包含.cpp 或实现函数的文件。

【讨论】:

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

链接器多重定义错误:为啥 <thread> 似乎定义了我的函数?

链接我的库的错误的多重定义

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

在多文件中C语言中全局变量的重定义

在多文件中C语言中全局变量的重定义

在多文件中C语言中全局变量的重定义