2009-11-08 5 views
2

я создал два файла:Использование ехЬегп в C не работает, как ожидалось

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». Когда я загрузить проект как A.c и B.c называет tunables_load_conservative но если через некоторое время, я вызываю в файле A.c 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 –

ответ

4

Похоже, у вас есть два отдельных процесса, A и B. extern декларация не устанавливает разделяемую память между процессами, но вместо этого позволяет разные единицы компиляции в рамках одного процесса для доступа к одной и той же переменной.

Чтобы поделиться переменной между процессами, вам понадобятся системно-зависимые методы IPC.

+0

Омг справа! -_- Я не могу это заметить, потому что я создал сценарий оболочки, который запускает оба процесса в автоматическом режиме. :П – Federico

1

tunables.o включен в ваш проект дважды. Каждая копия имеет свою собственную копию переменной timer_x.

Если вы хотите, чтобы они делили переменную, вы должны сгенерировать один исполняемый файл.

Если вам нужны два исполняемых файла, вам нужно поделиться им по-другому - возможно, используя временный файл и чтение/запись из него.