创作人 Leo
编辑时间 Sun Mar 14,2021 at 14:16
例:
main.c
int val1 = 2;
int main()
{
foo() ;
printf("%d \n", val1);
return 1;
}
func.c
int val1;
void foo()
{
val1 = 200;
}
console
# gcc func.c main.c -o d
# ./d
200
由于全局变量符号表是共享的,当变量在多个文件被声明,会造成意想不到的错误
解决方法
1: 保持变量都赋初始值,这样编译器在进行ld链接时,会报错:/tmp/ccCb2WBm.o:(.data+0x0): multiple definition of `val1’
2: 全局变量使用static修饰,这样就不会与其他文件的同名全局变量冲突
3: 编译时,使用gcc参数-fno-common
例:
# gcc -c -fno-common main.c
# gcc -c -fno-common func.c
# gcc -fno-common main.o func.o -o d
func.o:(.bss+0x0): multiple definition of `val1'
main.o:(.data+0x0): first defined here
collect2: ld 返回 1