main.o:main.c:function main:error:未定义对';变量名称';

main.o:main.c:function main:error:未定义对';变量名称';,c,C,我是一个完全的C新手(6小时前开始),我知道有大量的在线参考资料,我应该(也将)详细查看,但现在,我有一个紧急情况,需要帮助。我有一个包含以下文件的项目文件夹: boundary_val.c boundary_val.h helper.c helper.h init.c init.h main.c main.o sor.c sor.h uvp.c uvp.h visual.c visual.h makefile main.c应该调用列出的文件中的其他函数 makefile的内容如下: CC =

我是一个完全的C新手(6小时前开始),我知道有大量的在线参考资料,我应该(也将)详细查看,但现在,我有一个紧急情况,需要帮助。我有一个包含以下文件的项目文件夹:

boundary_val.c
boundary_val.h
helper.c
helper.h
init.c
init.h
main.c
main.o
sor.c
sor.h
uvp.c
uvp.h
visual.c
visual.h
makefile
main.c应该调用列出的文件中的其他函数

makefile的内容如下:

CC = gcc
CFLAGS = -Wall -pedantic -Werror
.c.o:  ; $(CC) -c $(CFLAGS) $<

OBJ =   helper.o\
        init.o\
        boundary_val.o\
        uvp.o\
        main.o\
        sor.o\
        visual.o


all:  $(OBJ)
    $(CC) $(CFLAGS) -o sim $(OBJ)  -lm

%.o : %.c
    $(CC) -c $(CFLAGS) $*.c -o $*.o

clean:
    rm $(OBJ)

helper.o      : helper.h 
init.o        : helper.h init.h 
boundary_val.o: helper.h boundary_val.h 
uvp.o         : helper.h uvp.h
visual.o      : helper.h
sor.o         : sor.h

main.o        : helper.h init.h boundary_val.h uvp.h visual.h sor.h
这些未定义的引用是在其他文件中定义并链接到main.c文件的函数,包含以下内容:

#include "helper.h"
#include "visual.h"
#include "init.h"
#include "sor.h"
#include "boundary_val.h"
#include "uvp.h"
#include <stdio.h>

当您调用
makemain
时,实际上是在调用
make
,目标
main
,它不存在于您的makefile中。目标
all
是在未指定目标时生成的特殊目标,在这种情况下,仅使用
make
。调用
make main
时,未找到名为
main
的目标,因此
make
推断应使用已存在的
main.o
对象文件构建该目标。你可以从线路上看到这一点

gcc   main.o   -o main
此外,您还应该将
-f
标志添加到
clean
目标中的
rm
命令中,以便它忽略不存在的文件(毕竟您只想清除所有文件)

TLDR;您应该单独使用
make
来构建
all
目标


有关如何构建makefile的更多信息,请参阅本makefile教程:

尝试运行
make clean
,然后运行
make
我不太明白您的意思,但您能否简单地展示一下代码的外观在构建项目时,您应该使用
make
而不是
make main
。这就是全部,还记得改变干净的目标,正如我在回答中提到的好的,完成了-至少单独运行make不会抛出任何错误。但是如何实际运行main.c呢?如果main.c文件包含
main
函数,并且您的代码在其中,那么当您启动
sim
可执行文件时,它将被执行。实际上,您从未“运行”main.c,但编译main.c后生成的可执行文件只需键入
makeall
,然后键入
/sim
rm helper.o init.o boundary_val.o uvp.o main.o sor.o visual.o
rm: cannot remove `helper.o': No such file or directory
rm: cannot remove `init.o': No such file or directory
rm: cannot remove `boundary_val.o': No such file or directory
rm: cannot remove `uvp.o': No such file or directory
rm: cannot remove `sor.o': No such file or directory
rm: cannot remove `visual.o': No such file or directory
make: *** [clean] Error 1
gcc   main.o   -o main
clean:
    rm -f $(OBJ)