c++ - 多重定义... | C++

标签 c++ linker object-files

这是一个有点理论性的问题...

我一直在阅读有关链接目标文件的内容。现在我收到有关某些函数的多个定义的错误消息。我相信已确定问题如下:

  • 我有两个单独的头文件 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/

相关文章:

android - 使用 JNI 时实例和类变量状态的问题

c++ - obj vector 到成员函数

static - 如何链接目标文件 (*.o) 和静态库文件 (*.a)

C 编程基础知识 : Why can't I see the . o 使用 gcc 编译 .c 文件后的文件

c++ - 如何在 Qt 中检查我的应用程序的内存使用情况

python - 在从 PyTorch 训练和导出的 LibTorch 中运行模型时获得的结果不正确

在动态加载之前检查共享库的兼容性

c++ - 如何检查哪个模块导致 LINK1112 错误?

c++ - 使用 c++ 和 Fortran/Call c++ code from Fortran/Unresolved external symbol 创建 .lib 文件

c++ - 管理生成文件中的依赖关系复杂性