前言:

事情是是这样的, 上课跟着老师敲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 不做更改

最后修改:2024 年 02 月 21 日
如果觉得我的文章对你有用,请随意赞赏