Apple Mach-O链接器命令失败,退出代码为1

时间:2013-04-24 02:45:09

标签: c++ xcode linker include

我正在使用Xcode构建一个C ++项目。

但我不明白错误信息:

“Apple Mach-O链接器命令失败,退出代码为1”

我发现#include是原因。

我有两个.cpp文件,其中包含相同的.h文件。如果我删除#include of one,它将成功构建。

其他头文件很好,期望上面描述的头文件。我已经使用过“ifndef”了。

1 个答案:

答案 0 :(得分:3)

#ifndef包括仅在翻译单元级别工作的警卫(通常是单个源文件)。

如果你在两个翻译单元中定义了两次相同的对象,那么包含保护不会解决这个问题,但是当你尝试将两个目标文件组合成一个可执行文件时,链接器会抱怨

我怀疑你的情况类似于:

hdr.h:
    #ifndef HDR_H
        #define HDR_H
        void rc(void);
        int xyzzy;
    #endif

prog1.c:
    #include "hdr.h"
    #include "hdr.h"
    int main (void) { rc(); return xyzzy; }

prog2.c:
    #include "hdr.h"
    void rc(void) { xyzzy = 0; }

在这种情况下,包含警戒会阻止标头在prog1.c中被包含两次,但它仍会包含在prog1.c {{1}中},意思是每个都有prog2.c的副本。

当您将它们链接在一起时,链接器将不会喜欢它。

解决方案是不在头文件中定义东西,而只是在那里声明它们,留下C文件的定义:

xyzzy

声明就像函数原型,外部变量,typedef等等(简单地说,在没有实际创建“对象”的情况下声明存在的东西)。

定义是创建“对象”的东西,比如非外部变量等等。

您需要跟踪两次定义的“对象”(链接器输出应该具有类似hdr.h: #ifndef HDR_H #define HDR_H int rc(void); extern int xyzzy; // declare, not define #endif prog1.c: #include "hdr.h" #include "hdr.h" int main (void) { rc(); return xyzzy; } prog2.c: #include "hdr.h" int xyzzy; // define int rc(void) { xyzzy = 0; } 的内容),然后确保标题中没有定义