这是一个有点理论性的问题...
我一直在阅读有关链接目标文件的内容。现在我收到有关某些函数的多个定义的错误消息。我相信已确定问题如下:
我有两个单独的头文件 A 和 B。
两个 header 访问相同的 header H。
我从 A 和 B 编译了目标文件 AO 和 BO。
当我尝试通过将 AO 和 BO 链接到 M 来编译包含 A 和 B 的 cpp 文件 M 时,我收到有关多个定义的错误消息。
错误消息所涉及的函数位于 H 中。
我假设问题是,在 AO 和 BO 中都以某种方式引用或编译代码到/从 H,因此当我在编译 M 时链接 AO 和 BO 时它出现两次。我是否正确识别了问题,或者是我可能遗漏了一些东西?
如果是这样,您如何避免或解决此类问题?
编辑:我说我编译了头文件。抱歉,这样说很草率。我使用头文件 A 和 B 中类方法的实现编译了 cpp 文件。
最佳答案
你不应该编译.h
(头)文件。 头文件 是一个 C++ 源文件,旨在通过 #include
指令包含在其他 C++ 源文件中。
您应该编译的唯一文件是 .cpp
文件,这些文件通常称为实现文件。
不要在头文件中包含函数定义也很重要。每个函数定义只能编译一次,因此必须编码到一个实现文件中。头文件应该只包含:
- 转发声明
- 宏
- 其他
#include
- 类型
- 外部人员
- 模板代码
- 函数原型(prototype)
您的问题的原因很可能是您在 H 文件中包含了完整的函数定义,因此,当您编译 A 和 B 实现文件时(它们应该被称为实现文件,如果你正在编译它们;或者,你可以考虑将函数定义从那些头文件移动到单独的实现文件中,并且只编译那些实现文件),函数被编译成 AO 和 BO 对象文件。这就是链接失败的原因;这些函数在链接时被多次定义。
要解决此问题,您需要将 H 头文件中的所有函数定义移动到单独的实现文件中。由于 H 似乎没有绑定(bind)到您已经拥有的任何单个实现文件(我这样说是因为它似乎是 A 和 B 的依赖项),将这些函数定义移动到新的 H 中可能最有意义。 cpp 实现文件。作为构建过程的一部分,您随后必须构建 H.cpp,并在链接时将其链接到最终的可执行文件中。
关于c++ - 多重定义... | C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29357841/