用 C 语言定义一个 `extern` var,xcode 发送一个 `Undefined symbols for architecture x86_64`
define a `extern` var in C language, xcode send a `Undefined symbols for architecture x86_64`
这个问题很难描述,我会尽力的。
好的,这是详细信息:
- 我有一个 public 头文件,名为
header.h
;
- 在header.h中定义一个
extern int a;
;
- 创建
test1.c
并包含 header.h
;
- 在
test1.c
中使用var a
,但是xcode报错:Undefined symbols for architecture x86_64
;
我试过删除extern
,这个问题就没有了。我在google里搜了extern
,他们说不加extern
,xcode会自动加extern
。其实加是有区别的extern
自己加 extern
xcode。
那有什么区别?
当你声明一个变量 extern
时,这是对编译器的承诺,"Trust me, this will be there when you need it." 它不会创建变量,它只是告诉编译器它在某处被真实地声明了,并且编译器不需要知道在哪里。
你骗了编译器。你实际上并没有在任何地方声明变量,你只是说你会。然后linker找的时候,没找到。
当你拿走 extern
时,这将变量的承诺变成了实际的声明。编译器不必相信你,它只是按照你告诉它的那样创建变量。但是因为它在 header 中,如果你将该变量包含在两个不同的代码文件中并将它们编译成单独的 object 文件,当你尝试 link 它们时,你会得到一个关于重复的符号。 extern
的正确使用方法是在header文件中声明变量extern
,然后在实现(.c
)文件中声明为真实
header.h:
#ifndef HEADER_H
#define HEADER_H
extern int a;
#endif
test1.c
#include "header.h"
int a = 5;
...
然后您可以从不同的 c 文件访问相同的变量 a
。
test2.c
#include "header.h"
int foo() {
return a;
}
这个问题很难描述,我会尽力的。 好的,这是详细信息:
- 我有一个 public 头文件,名为
header.h
; - 在header.h中定义一个
extern int a;
; - 创建
test1.c
并包含header.h
; - 在
test1.c
中使用vara
,但是xcode报错:Undefined symbols for architecture x86_64
;
我试过删除extern
,这个问题就没有了。我在google里搜了extern
,他们说不加extern
,xcode会自动加extern
。其实加是有区别的extern
自己加 extern
xcode。
那有什么区别?
当你声明一个变量 extern
时,这是对编译器的承诺,"Trust me, this will be there when you need it." 它不会创建变量,它只是告诉编译器它在某处被真实地声明了,并且编译器不需要知道在哪里。
你骗了编译器。你实际上并没有在任何地方声明变量,你只是说你会。然后linker找的时候,没找到。
当你拿走 extern
时,这将变量的承诺变成了实际的声明。编译器不必相信你,它只是按照你告诉它的那样创建变量。但是因为它在 header 中,如果你将该变量包含在两个不同的代码文件中并将它们编译成单独的 object 文件,当你尝试 link 它们时,你会得到一个关于重复的符号。 extern
的正确使用方法是在header文件中声明变量extern
,然后在实现(.c
)文件中声明为真实
header.h:
#ifndef HEADER_H
#define HEADER_H
extern int a;
#endif
test1.c
#include "header.h"
int a = 5;
...
然后您可以从不同的 c 文件访问相同的变量 a
。
test2.c
#include "header.h"
int foo() {
return a;
}