gcc 编译报错 multiple definition of xxx
在 Linux 系统上编译程序有时会遇到 multiple definition of xxx 的错误,这类错误通常是由于代码编写不规范,同一个变量重复定义导致,这类代码在低版本的 gcc 编译器可能不会报错,而升级了编译器版本之后就会报错,新版本的编译器对不规范的代码检查更加严格。
这类错误通常是代码不规范引起,一般修改代码,解决重复定义的问题即可。但是有些老旧的代码改起来比较费尽,我们也可以通过添加编译参数进行规避。在 gcc 或者 Makefile 的 CFLAGS 上添加 -Xlinker -zmuldefs 选项即可规避重复定义的报错。
下面看一个示例:
代码文件 main.c
#include <stdio.h> int key = 10; int main(int argc, char *argv[]) { int value = add(20); printf("key:%d\n", value); return 0; }
代码文件 func.c
int key = 10; int add(int n) { return key + n; }
上述两个代码文件中,全局变量 key 被重复定义了,直接编译上述代码会报错,如下:
[zhang@localhost multidefs]$ gcc main.c func.c -o test /tmp/ccw6Cx53.o:(.data+0x0): multiple definition of `key' /tmp/ccuShehl.o:(.data+0x0): first defined here collect2: error: ld returned 1 exit status
加上 -Xlinker -zmuldefs 选项就能编译成功,执行程序,输出结果也没有问题,如下:
[zhang@localhost multidefs]$ gcc -Xlinker -zmuldefs main.c func.c -o test [zhang@localhost multidefs]$ ./test key:30
文章评论
共0条评论