gcc不解析带有或不带-c选项的外部全局变量

时间:2010-05-08 10:07:16

标签: c gcc linker global extern

所以我有这个问题:我在我的C程序中声明了一些外部全局变量。 如果我没有为gcc使用-c选项,我会得到未定义的引用错误。但是使用-c选项,链接没有完成,这意味着我没有生成可执行文件。

那么我该如何解决这个问题?

这是我的makefile(感谢Alex)

CC = gcc                      # compiler/linker frontend
INCL = -I$(INCL_DIR)          # includes
DEFS = -D_DEBUG_              # defines
CFLAGS = -g $(INCL) $(DEFS)   # compiler flags
LFLAGS = -lpthread -lm -g     # linker flags

OBJ = approx.o producteur.o sequentialApproximation.o main.o
BIN = calculPi.exe
LINKOBJ  = approx.o producteur.o sequentialApproximation.o main.o
RM = rm -fv

all: $(BIN)

clean:
 ${RM} *\~ \#*\# $(OBJ)

clean_all: clean
 ${RM} $(BIN)

cleanall: clean
 ${RM} $(BIN)

$(BIN): $(OBJ)
 $(CC) $(LFLAGS) -o $@ $^

main.o: main.c
approx.o: approx.c approx.h
producteur.o: producteur.c producteur.h
sequentialApproximation.o : sequentialApproximation.c sequentialApproximation.h

.c.o:
 $(CC) $(CFLAGS) -c $<

以下是make:http://pastebin.com/NzsFetrn

的输出

我确实在approx.h(extern和global)中声明了extern变量,我尝试在about.c中调用它们,并且在那里它不起作用。

1 个答案:

答案 0 :(得分:3)

解决方案1 ​​

您无法在链接阶段传递-c,因为这会告诉编译器跳过链接。

你的问题是

$(BIN): $(OBJ)
    $(CXX) $(LINKOBJ) -o "calculPi.exe"

CXX_FLAGS =-g -c -lpthread -lm

其中$(CXX)扩展为gcc -g -c -lpthread -lm ...

摆脱那里的-c

从源代码模块编译时只传递-c。

解决方案2

第二个问题,你实际上并没有在任何地方定义变量。在.c文件中,您需要以下行:

Coord* production;
int indice_prod;
int indice_cons;

(假设你真的想要全局变量)。这将解决未解决的外部错误。 在分配之前你不能写信给他们!

备注

另请注意,您可以在一个规则中指定如何从源构建目标文件:

.c.o:
    $(CC) $(CFLAGS) -c $<

并指定没有规则的依赖项:

main.o: main.c
approx.o: approx.c approx.h
producteur.o: producteur.c producteur.h
sequentialApproximation.o : sequentialApproximation.c sequentialApproximation.h

其他说明。

此外,作为一般经验法则,CXX应该只包含编译器名称,不包含标志。那些应该进入CXX_FLAGS。你为什么称它为CXX而不是CC?如果需要C ++编译器,请使用g++,或使用CC。由于你有.c个文件,我会假设C.所以在你的情况下,你应该改变:

CXX_FLAGS =-g -c -lpthread -lm
CXX = gcc $(CXX_FLAGS) $(INCL) $(DEFS)

CC = gcc
CFLAGS = -g -lpthread -lm $(INCL) $(DEFS)  # also removed -c

并且您不需要单独的LINK_CXX

示例Makefile

所以最小的Makefile应该是这样的:

# Makefile
CC = gcc                      # compiler/linker frontend
INCL = -I$(INCL_DIR)          # includes
DEFS = -D_DEBUG_              # defines
CFLAGS = -g $(INCL) $(DEFS)   # compiler flags
LFLAGS = -lpthread -lm -g     # linker flags

OBJ = approx.o producteur.o sequentialApproximation.o main.o
BIN = calculPi.exe

all: $(BIN)

$(BIN): $(OBJ)
    $(CC) $(LFLAGS) -o$@ $^

main.o: main.c
approx.o: approx.c approx.h
producteur.o: producteur.c producteur.h
sequentialApproximation.o : sequentialApproximation.c sequentialApproximation.h

.c.o:
    $(CC) $(CFLAGS) -c $<

# clean and other stuff.