前言:
事情是是这样的, 上课跟着老师敲C代码, 然后编译 .o
文件, 在最后链接编译这些文件的时候, 报错 multiple definition of...
其他人都都编译成功了, 唯独我的编译器报错(╯°□°)╯︵ ┻━┻
其他人用的Ubuntu, 我用的Debian.
检查了代码, 一模一样, 难不成是系统问题?
课后, 我百度了一下, 看看到底是什么导致编译器报错.
编译器都是报错 multiple definition of ...
, 但相同的代码, 在其他人的机器上都成功编译了.
我对Debian还是挺有信心的, 也就是说我觉得不太可能是系统的问题,
继续调查(百度)= ̄ω ̄=, 有意思的来了~
我发现gcc 10不允许在头文件中声明全局变量1, 因为在多个文件中引用头文件会导致全局变量被重复声明, 进而导致报错.
再看看朋友的gcc编译器版本, 好家伙, 都是gcc 10 以下的编译器版本.
怪不得, 只有我的gcc报错.
解决方法其实挺简单, 就是不把全局变量声明在头文件中.
具体的解决办法
在 .c
文件中声明全局变量, 然后在 .h
文件中利用 extern
引用 .c
中的全局变量
假设有两个文件, 一个 example.h
头文件, 和两个 .c
文件
example.h
main.c
other.c
报错代码
// 文件: exmaple.h
#include <stdio.h>
char sentence[] = {"This is globle variable test"};
// 文件: main.c
#include "example.h"
int main(){
printf("%s\n\n", sentence);
variable_print();
return 0
}
// 文件: other.c
#include "example.h"
void variable_print() {
printf("come from \"other.c\": $s\n", sentence);
}
解决代码
// 文件: exmaple.h
#include <stdio.h>
// 在 ".h" 文件中引用全局变量
extern char sentence[];
// 文件: main.c
#include "example.h"
// 在 "main.c" 文件里声明全局变量
char sentence[] = {"This is globle variable test"};
int main(){
printf("%s\n", sentence);
variable_print();
return 0
}
other.c
不做更改