Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
gcc不解析外部全局变量,无论是否使用-c选项_C_Gcc_Linker_Global_Extern - Fatal编程技术网

gcc不解析外部全局变量,无论是否使用-c选项

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

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

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

这是我的makefile(感谢Alex)

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.