我正在使用Xcode构建一个C ++项目。
但我不明白错误信息:
“Apple Mach-O链接器命令失败,退出代码为1”
我发现#include是原因。
我有两个.cpp文件,其中包含相同的.h文件。如果我删除#include of one,它将成功构建。
其他头文件很好,期望上面描述的头文件。我已经使用过“ifndef”了。
答案 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; }
的内容),然后确保标题中没有定义。