我有文件" A.c"," A.h"和" B.h"," B.m" 。 我包括" A.h"在" A.c"和" B.h"。
然而,Xcode给了我许多重复符号的链接错误"找到。
ld: 13 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
如何编译我的程序?
A.H
#ifndef CPU_H_
#define CPU_H_
...
#endif
A.C
#include <stdio.h>
#include "A.h"
...
B.h
#import <Cocoa/Cocoa.h>
#import "A.h"
...
我在A.c和B.m中获得了在A.h中定义的变量的重复符号。
答案 0 :(得分:2)
不要在头文件中定义全局变量。当你这样做时,你会得到重复的符号。
#ifndef CPU_H_
#define CPU_H_
...
unsigned char GlobalVariable = 'a'; // ERROR: Causes duplicates symbols.
...
#endif
包括 GlobalVariable
(即直接复制到)A.c和B.m.这将创建相同符号的两个副本。因此,您会得到重复的符号。
要解决此问题,请仅在1 .c或.m文件中定义全局变量。然后你将安全地只有该标志的一个副本。现在,如何让B.h和B.m知道你的全球符号?这是通过在A.h中声明(注意:声明和定义不同)GlobalVariable
来完成的。
#ifndef CPU_H_
#define CPU_H_
...
extern unsigned char GlobalVariable; // Declare GlobalVariable
...
#endif
#include <stdio.h>
#include "A.h"
...
unsigned char GlobalVariable = 'a'; // Define GlobalVariable