gcc不解析外部全局变量,无论是否使用-c选项
所以我有一个问题:我在我的C程序中声明了一些外部全局变量。 如果不对gcc使用-c选项,则会出现未定义的引用错误。但是使用-c选项,链接没有完成,这意味着我没有生成可执行文件 那么我该如何解决这个问题呢 这是我的makefile(感谢Alex)gcc不解析外部全局变量,无论是否使用-c选项,c,gcc,linker,global,extern,C,Gcc,Linker,Global,Extern,所以我有一个问题:我在我的C程序中声明了一些外部全局变量。 如果不对gcc使用-c选项,则会出现未定义的引用错误。但是使用-c选项,链接没有完成,这意味着我没有生成可执行文件 那么我该如何解决这个问题呢 这是我的makefile(感谢Alex) CC=gcc#编译器/链接器前端 INCL=-I$(INCL#u DIR)#包括 DEFS=-D_DEBUG#定义 CFLAGS=-g$(包括)$(定义)#编译器标志 LFLAGS=-lpthread-lm-g#链接器标志 OBJ=约为o product
CC=gcc#编译器/链接器前端
INCL=-I$(INCL#u DIR)#包括
DEFS=-D_DEBUG#定义
CFLAGS=-g$(包括)$(定义)#编译器标志
LFLAGS=-lpthread-lm-g#链接器标志
OBJ=约为o producteur.o sequentialApproximation.o main.o
BIN=calculPi.exe
LINKOBJ=约为0 producteur.o顺序近似值o main.o
RM=RM-fv
全部:$(BIN)
清洁:
${RM}*\~\\\\\\\\\\\\\\\\\\\\\\\\\\\\\$(OBJ)
清洁所有人:清洁
${RM}$(BIN)
干净利落:干净利落
${RM}$(BIN)
$(BIN):$(OBJ)
$(CC)$(LFLAGS)-o$@$^
main.o:main.c
约为o:约为c约为h
producteur.o:producteur.c producteur.h
顺序近似.o:顺序近似.c顺序近似.h
.c.o.:
$(CC)$(CFLAGS)-c$<
下面是make的输出:
我确实在约h(extern和global)中声明了extern变量,并尝试在约c中调用它们,但在那里它不起作用。解决方案1
在链接阶段不能传递-c
,因为这会告诉编译器跳过链接
你的问题是
$(BIN): $(OBJ)
$(CXX) $(LINKOBJ) -o "calculPi.exe"
与
其中$(CXX)
扩展为gcc-g-c-lpthread-lm…
去掉那里的-c
从源代码模块编译到对象模块时仅传递-c
解决方案2
第二个问题是,您实际上没有在任何地方定义变量。在.c
文件中,您需要以下行:
Coord* production;
int indice_prod;
int indice_cons;
(假设您确实需要全局变量)。这将修复未解决的外部错误。
在他们被分配之前,你不能给他们写信
笔记
还请注意,您可以在一个规则中指定如何从源生成对象文件:
.c.o:
$(CC) $(CFLAGS) -c $<
等等
其他注释。
另外,根据一般经验,CXX
应该只包含编译器名称,而不包含标志。这些应该放在CXX\u标志中
。你为什么叫它CXX
而不是CC
?如果你想要一个C++编译器,或者使用<代码> cc>代码,请使用<代码> G++<代码>。由于您有.c
文件,我将假定为c。因此,在您的情况下,您应该更改:
CXX_FLAGS =-g -c -lpthread -lm
CXX = gcc $(CXX_FLAGS) $(INCL) $(DEFS)
到
而且您不需要单独的链接\u CXX
示例生成文件
因此,最小生成文件应该如下所示:
# 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.
#生成文件
CC=gcc#编译器/链接器前端
INCL=-I$(INCL#u DIR)#包括
DEFS=-D_DEBUG#定义
CFLAGS=-g$(包括)$(定义)#编译器标志
LFLAGS=-lpthread-lm-g#链接器标志
OBJ=约为o producteur.o sequentialApproximation.o main.o
BIN=calculPi.exe
全部:$(BIN)
$(BIN):$(OBJ)
$(CC)$(LFLAGS)-o$@$^
main.o:main.c
约为o:约为c约为h
producteur.o:producteur.c producteur.h
顺序近似.o:顺序近似.c顺序近似.h
.c.o.:
$(CC)$(CFLAGS)-c$<
#清洁和其他东西。
嘿,亚历克斯,谢谢你帮我。关于如何构建对象,有一个规则:.c.o:$(CC)$(CFLAGS)-c这是正确的吗?它说缺少了一个分隔符(同样,请原谅,因为我在编写makefile方面非常糟糕,在编译c代码方面也不擅长),而且,当我在$(BIN)规则中去掉-c时,我仍然有我未定义的引用!我没有叫它CXX,正如我告诉过你的,我带了一个我编辑过的现有makefile,我会尝试一下,再次让你知道谢谢。实际上我今天下午会很忙,所以我明天会尝试:)再次感谢你的帮助!这是新的makefile,这是make输出:未定义的引用是我在approx.h中声明的gblobal外部变量,我在approx.c中设置了它(我必须在producteur.c中使用它)@Moons,其中定义了indice\u prod
?并理想地编辑您的原始问题。(并删除LINKOBJ变量,您不需要它)您可以删除LINKOBJ变量,它是冗余的。您需要定义变量,仅在外部声明变量是不够的。
main.o: main.c
approx.o: approx.c approx.h
producteur.o: producteur.c producteur.h
sequentialApproximation.o : sequentialApproximation.c sequentialApproximation.h
CXX_FLAGS =-g -c -lpthread -lm
CXX = gcc $(CXX_FLAGS) $(INCL) $(DEFS)
CC = gcc
CFLAGS = -g -lpthread -lm $(INCL) $(DEFS) # also removed -c
# 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.