2009-11-08 61 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变量副本。

如果您希望他们共享变量,您必须生成一个可执行文件。

如果您需要两个可执行文件,您需要以其他方式共享该值 - 可能使用临时文件并从中读取/写入。