【问题标题】:GCC complaining about a duplicate definition (where only one exists)GCC 抱怨重复的定义(只有一个存在)
【发布时间】:2012-06-14 17:53:20
【问题描述】:

在 Xcode 中处理较大的项目时,我似乎只是遇到了一个接一个的错误。这一次,GCC 抱怨结构打印函数的重复定义 - 一个是实际定义的(在不同的文件中),另一个是使用它的地方(在驱动程序中)。

我得到的具体错误是这样的:

ld: duplicate symbol _fprintConfiguration in
/.../bits.build/Objects-normal/x86_64/Block.o and
/.../bits.build/Objects-normal/x86_64/bits.o

Block.o 包含定义,bits.o 包含驱动程序。


我已经对此进行了一些研究,但似乎每个问题都存在于人们通过#include 实际定义它两次,但在我所有的文件中我只使用#import#import 指令不应该“智能”包含文件吗?还有其他原因我可能会收到此错误吗?我可以尝试其他解决方案吗?

感谢您的帮助:)

【问题讨论】:

    标签: objective-c gcc linker-errors


    【解决方案1】:

    问题是您在多个翻译单元(Block.obits.o)中包含相同的定义。要解决此问题,请声明函数 inline 或将定义移动到(单个)源(非标头)文件。

    这与#include#import 的问题正交。这就是在 same 翻译单元中多次包含相同的代码。

    【讨论】:

    • 哇,我从没想过将定义从头文件移动到实现文件会有所作为。据我了解,#include#import 本质上都将文件 include 文件放入一大堆混乱的编译单元中并在那里编译。如果是这种情况,为什么将定义移出头文件会有所不同?
    • 除非... 也许将它包含在 Block.m 中会与包含它的实际目标发生冲突,这就是链接器抛出的地方。也许#import 并不像文档描述的那么聪明;)
    • @vermiculus,问题是当定义在头文件中时,它看起来像函数在两个不同的翻译单元(两个单元都包含相同的头文件)中定义的函数。
    • 是的,如果某件事被声明一次以上,这绝不是问题,但多次定义它会引起歧义(即使定义相同(范围界定))。
    猜你喜欢
    • 2018-04-27
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 2012-10-13
    相关资源
    最近更新 更多