0

当我尝试使用 -D 构建我的 c 代码文件时出现以下错误。但是,如果我在没有 -D 的情况下构建它,它就可以工作。我不知道为什么。谢谢。(我的机器是ubuntu12.10,32bit)

gcc c1.c c2.c -D DEBUG

/tmp/ccX04EIf.o:(.data+0x0): multiple definition of `g'
/tmp/cc0j9MoU.o:(.data+0x0): first defined here
collect2: ld returned 1 exit status

这是我的源代码:

全局.h

#ifdef DEBUG 
    int g = 23;
    static int init = 1;
#else
    int g;
    static int init = 0;
#endif

c1.c

#include "global.h"
int f() {
    return g + 1;
}

c2.c

#include <stdio.h>
#include "global.h"

int main() {
    if (!init) {
        g = 37;
    }
    int t = f();
    printf("calling f yields %d\n", t);

    return 0;
}
4

2 回答 2

3

您在头文件中定义变量g,这意味着它将在包含头文件的所有源文件中定义。

而是声明它,比如

extern int g;

然后在单个源文件中定义它。

于 2013-10-25T07:13:35.317 回答
1

两个代码路径(有和没有)之间的区别在于变量DEBUG的初始化。g没有它,它只是一个“暂定”定义,因此该符号仅在真正使用它的文件中生成,即c2.o.

通过初始化,它是符号的真实定义,因此它也在c1.o.

根据经验,头文件不应该包含数据定义,只包含声明。数据“仅声明”应使用关键字extern. 然后,您需要在您的一个 .c 文件中定义任何此类符号。

于 2013-10-25T08:26:59.570 回答