Apple Mach-O Linker错误,重复符号注释:没有导入'.m'文件

时间:2014-06-02 20:32:45

标签: ios xcode linker

我遇到了一个突然出现的奇怪错误的问题(或者至少我不记得我为此问题所做的任何事情),错误列表如下所示:

  

重复符号_NSStringFromMargin in:       /Users/...-ehsqzpjjajyzdnevdhqhhsgeqhre/Build/Intermediates/ABC.build/Debug-iphonesimulator/ABC.build/Objects-normal/x86_64/CSFilterStrip.o       /用户/...- ehsqzpjjajyzdnevdhqhhsgeqhre /建造/中间体/ ABC.build /调试-iphonesimulator / ABC.build /对象 - 正常/ x86_64的/ CSMainMenuVC.o

     

...

     

ld:架构x86_64 clang的6个重复符号:错误:   链接器命令失败,退出代码为1(使用-v查看调用)

所有6个关于相同的NSStringFromMargin且总是第一行指向CSFilterStrip.o位置,我无法弄清楚为什么会发生这种情况,下面是Margin.h

//Margin.h
#ifndef ABC_Margin_h
#define ABC_Margin_h

struct Margin {
    int left;
    int top;
    int right;
    int bottom;
};
typedef struct Margin Margin;

CG_INLINE Margin
MarginMake(int left, int top, int right, int bottom)
{
    Margin margin;

    margin.left = left;
    margin.top = top;
    margin.right = right;
    margin.bottom = bottom;

    return margin;
}
NSString *NSStringFromMargin(Margin margin)
{
    return [NSString stringWithFormat:@"{%d,%d,%d,%d}",margin.left,margin.top,margin.right,margin.bottom];
}

#endif

在CSFilterStrip.h中我正在导入Margin.h:

@property (nonatomic) Margin margin;

没有这个导入我有:“接口类型不能静态分配”错误,我可以添加*但为什么在使用CGRect时不需要指针,之后我已经制作了Margin对象。

只是重申:我已经检查过并且没有意外导入“* .m”。

更新@Michael诊断出我将攻击方法从标题移到了为Margin设计的单独类别:NSString + MarginUtils,这解决了这个问题。

1 个答案:

答案 0 :(得分:2)

问题是您在头文件中定义NSStringFromMargin。相反,您应该在头文件中声明它,并在.m文件中定义它。

.h应该是:

NSString *NSStringFromMargin(Margin margin);

.m应该是:

NSString *NSStringFromMargin(Margin margin)
{
    return [NSString stringWithFormat:@"{%d,%d,%d,%d}",margin.left,margin.top,margin.right,margin.bottom];
}

另见this answer to a similar question