make multiple definition of `*` first defined here问题解决办法

问题描述:

parser.c:7: multiple definition of `common_config’
global.o:global.c:20: first defined here

parser.o
0000000000000008 B common_config

global.o
0000000000000000 B common_config

两个文件编译的时候没有问题,但是在链接的时候就出现了上述问题。

在两个问题里分别定义了全局变量COMMON_CONFIG *common_config = NULL;

所以导致了问题,定义全局变量的时候只能初始化一次。

文件解决办法:

把parser.c文件中的初始化操作取消,只定义,不初始化,这样就几个文件都共用一个全局变量。

修改后:

parser.o
0000000000000008 C common_config

nm命令中对C和B的说明如下:

“B”
“b” The symbol is in the uninitialized data section (known as BSS).

“C” The symbol is common. Common symbols are uninitialized data. When linking, multiple common symbols may appear with the same name. If the symbol is defined anywhere, the common symbols are treated as undefined references.

查看下面的描述

int x =0; 跟 int x; 的效果看起来是一样的。但其实这里面的差别很大,强烈建议大家所有的全局变量都要初始化,他们的主要差别如下:在C语言里,全局变量如果不初始化的话,默认为0,也就是说在全局空间里:编译器在编译的时候针对这两种情况会产生两种符号放在目标文件的符号表中,对于初始化的,叫强符号,未初始化的,叫弱符号

连接器在连接目标文件的时候,如果遇到两个重名符号,会有以下处理规则:1、如果有多个重名的强符号,则报错。

2、如果有一个强符号,多个弱符号,则以强符号为准。

3、如果没有强符号,但有多个重名的弱符号,则任选一个弱符号。

C/C++的全局变量初始化与不初始化的区别

c全局变量初始化

c全局变量定义

c全局变量定义出现multiple definition

c全局变量 出现multiple definition

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>