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条评论