【问题标题】:Error when building c code with -D使用 -D 构建 c 代码时出错
【发布时间】:2013-10-25 07:11:33
【问题描述】:

当我尝试使用 -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

这是我的源代码:

global.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;
}

【问题讨论】:

  • 为什么-DDEBUG之间有空格?
  • @HowChen 重要吗?没有。
  • @Jost,但他说没有 -D 也可以
  • @HowChen Mybe 我的陈述不清楚。我的意思是用 -D DEBUG 编译

标签: c building


【解决方案1】:

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

而是声明它,就像

extern int g;

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

【讨论】:

  • 或添加包含警卫?
  • @HowChen Include 防护仅防止在单个翻译单元(例如源文件)中多次包含,而不是防止在多个翻译单元中多次包含。
  • @JoachimPileborg 我明白你的意思。现在我更改 global.h 以确保只有 g 的声明,并在定义 DEBUG 时将 g 定义移动到 c2.c 中。有用。谢谢。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多