无论有或没有 -c 选项,gcc 都不解析外部全局变量

发布于 2024-08-31 23:15:01 字数 1120 浏览 15 评论 0原文

所以我有这个问题:我在我的 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< /a>

我确实在 approx.h 中声明了外部变量(外部和全局),并且我尝试在 approx.c 中调用它们,但它不起作用。

So i have this issue : i am declaring some extern global variables in my C program.
If I don't use the -c option for gcc, i get undefined references errors. But with that -c option, the linking is not done, which means that i don't have an executable generated.

So how do I solve this?

Here is my makefile (written thanks to 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 
lt;

And here is the output of make : http://pastebin.com/NzsFetrn

I did declare extern variables in approx.h (extern and global) and i try to call them in approx.c, and there it doesn't work.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

﹏雨一样淡蓝的深情 2024-09-07 23:15:01

解决方案 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 
lt;

并在没有规则的情况下指定依赖项:

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 
lt;

# clean and other stuff.

Solution 1

You can't pass -c in your linking phase, as that will tell the compiler to skip linking.

Your problem is

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

with

CXX_FLAGS =-g -c -lpthread -lm

where $(CXX) expands to gcc -g -c -lpthread -lm ...

get rid of the -c there.

Only pass -c when compiling from source to object modules.

Solution 2

Re the second problem, you aren't actually defining the variables anywhere. In your .c file you need the lines:

Coord* production;
int indice_prod;
int indice_cons;

(Assuming you really want global variables). This will fix the unresolved external error.
You can't write to them until they've been allocated!

Notes

Also note that you can specify how to build object files from source in one rule:

.c.o:
    $(CC) $(CFLAGS) -c 
lt;

and specify the dependencies without rules:

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

etc.

Other notes.

Also, as general rule of thumb, CXX should only contain the compiler name, no flags. Those should go in CXX_FLAGS. And why are you calling it CXX not CC? Use g++ if you want a C++ compiler, or use CC. Since you have .c files, I'll assume C. So in your case, you should change:

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

to

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

And you don't need a separate LINK_CXX.

Sample Makefile

So a minimal Makefile should look like:

# 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 
lt;

# clean and other stuff.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文