2013-10-25 24 views
0

構建c代碼時出現錯誤當我嘗試使用-D構建我的c代碼文件時,出現以下錯誤。但是,如果我在沒有-D的情況下構建它,它就可以工作。我不知道爲什麼。謝謝。 (我的機器是ubuntu12.10,32位)使用-D

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; 
} 
+0

爲什麼'-D'和'DEBUG'之間的空格? –

+0

@HowChen重要嗎? # – RedX

+0

@Jost,但他說,它的工作原理沒有-D –

回答

3

定義在頭文件中的變量g,這意味着它會在包含頭文件所有源文件來限定。

相反聲明它,像

extern int g; 

,然後在一個源文件中定義它。

+0

或添加包括警衛? –

+0

@HowChen包括保護僅防止多個包含在單個翻譯單元(例如源文件)中,而不是針對多個包含在多個翻譯單元中。 –

+0

@JoachimPileborg我明白你的意思。現在我更改global.h以確保只聲明g,並在定義DEBUG時將g定義移動到c2.c中。有用。謝謝。 – qiaoba

1

兩個代碼路徑(帶和不帶DEBUG)之間的區別是g變量的初始化。沒有它,它只是一個「暫定」的定義,所以符號只能在真正使用它的文件中生成,即c2.o

初始化時它是符號的真實定義,所以它也生成在c1.o中。

根據經驗,頭文件不應該包含數據定義,只包含聲明。數據「僅限聲明」應使用關鍵字extern進行。然後你需要在你的.c文件中定義任何這樣的符號。