2013-04-24 129 views
1

我正在使用Xcode构建C++项目。Apple Mach-O链接器命令失败,退出代码为1

但我不明白的错误消息:

“苹果的Mach-O连接器命令退出码1失败”我发现的#include就是这个原因。

我有两个包含相同.h文件的.cpp文件。如果我删除#包括一个,它将被成功构建。

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

回答

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.cprog2.c ,这意味着每个将具有xyzzy的副本。

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

的解决方案是在头不明确的事情,但仅仅宣称他们那里,留下定义的C文件:

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; } 

声明,东西之类的函数原型,EXTERN变量,类型定义等等(简单地说,那些声明事物并不实际创建“对象”的东西)。

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

你需要跟踪什么“对象”被定义了两次(连接器输出应该有类似doubly-defined symbol 'xyzzy'),然后确保它不是在头文件中定义

+0

感谢您的解释。非常有帮助的说明 – 2013-07-26 19:35:52

相关问题