2009-11-08 58 views
2

我已經創建了兩個文件不起作用:在C使用的extern預期

tunables.h

#ifndef TUNABLES_H 
#define TUNABLES_H 

void tunables_load_conservative(); 
void tunables_load_aggressive(); 

extern int timer_x; 
#endif /*TUNABLES_H */ 

和tunables.c

#include "tunables.h" 

int timer_x; 

void tunables_load_conservative(){ 
    timer_x = 3; 
} 
void tunables_load_aggressive(){ 
    timer_x = 1; 
} 

所有的其他文件我項目包括「tunables.h」。當我加載的項目都變交流和B.c調用tunables_load_conservative但如果,過了一段時間,我在文件交流轉換器調用tunables_load_aggressive()文件B.c的timer_x仍然3.爲什麼?

這是我的Makefile:

INCLUDE=`pwd`/include 
GCCFLAGS= -ansi -O3 -pedantic -Wall -Wunused -I${INCLUDE} -DDEBUG 
GCCOTHERFLAGS= -ggdb -pg 

all: A B 

A: A.o tunables.o 
    gcc -o A ${GCCFLAGS} ${GCCOTHERFLAGS} tunables.o 

B: B.o tunables.o 
    gcc -o LBfixed ${GCCFLAGS} ${GCCOTHERFLAGS} tunables.o 

A.o: A.c 
    gcc -c ${GCCFLAGS} ${GCCOTHERFLAGS} A.c 

B.o: B.c 
    gcc -c ${GCCFLAGS} ${GCCOTHERFLAGS} B.c 

tunables.o: tunables.c 
    gcc -c ${GCCFLAGS} ${GCCOTHERFLAGS} tunables.c 

clean: 
    rm -rf *.o A B 
+0

請正確標記與製作相關的問題(使用[make]標記)。更多信息:http://meta.stackexchange.com/questions/24030/why-do-they-specify-makefile-tag-instead-of-make/26567#26567 – 2009-11-09 19:50:49

回答

4

它看起來像你有兩個獨立的過程,A和B. extern聲明不成立跨進程共享內存,而是允許不同的編譯單元在同一進程內訪問相同的變量。

要跨進程共享變量,您需要使用系統相關的IPC方法。

+0

Omg你的權利! -_- 我無法注意到它,因爲我創建了一個自動運行這兩個進程的shell腳本。 :P – Federico 2009-11-08 09:58:01

1

tunables.o包含在您的項目中兩次。每個副本都有自己的timer_x變量副本。

如果您希望他們共享變量,您必須生成一個可執行文件。

如果您需要兩個可執行文件,您需要以其他方式共享該值 - 可能使用臨時文件並從中讀取/寫入。