我是 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 应该调用列出的文件中的这些其他函数。
生成文件如下所示:
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
当我在终端中运行make main
时,出现以下错误:
gcc main.o -o main
main.o:main.c:function main: error: undefined reference to 'read_parameters'
main.o:main.c:function main: error: undefined reference to 'matrix'
main.o:main.c:function main: error: undefined reference to 'matrix'
main.o:main.c:function main: error: undefined reference to 'matrix'
main.o:main.c:function main: error: undefined reference to 'matrix'
main.o:main.c:function main: error: undefined reference to 'init_uvp'
main.o:main.c:function main: error: undefined reference to 'calculate_dt'
main.o:main.c:function main: error: undefined reference to 'boundaryvalues'
main.o:main.c:function main: error: undefined reference to 'calculate_fg'
main.o:main.c:function main: error: undefined reference to 'calculate_rs'
main.o:main.c:function main: error: undefined reference to 'sor'
main.o:main.c:function main: error: undefined reference to 'calculate_uv'
main.o:main.c:function main: error: undefined reference to 'write_vtkFile'
main.o:main.c:function main: error: undefined reference to 'write_vtkFile'
main.o:main.c:function main: error: undefined reference to 'free_matrix'
main.o:main.c:function main: error: undefined reference to 'free_matrix'
main.o:main.c:function main: error: undefined reference to 'free_matrix'
main.o:main.c:function main: error: undefined reference to 'free_matrix'
collect2: ld returned 1 exit status
make: *** [main] Error 1
这些未定义的引用是在其他文件中定义并链接到 main.c 文件的函数,如下所示:
#include "helper.h"
#include "visual.h"
#include "init.h"
#include "sor.h"
#include "boundary_val.h"
#include "uvp.h"
#include <stdio.h>
似乎make
正在阅读main.o而不是main.c,有人可以告诉我发生了什么吗?
编辑:
运行make clean
并得到此错误:
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
当你调用make main
时,你实际上是在用目标main
调用make
,这在你的makefile中不存在。目标all
是在未指定目标时构建的特殊目标,在本例中仅使用 make
。当您调用 make main
时,未找到名为 main
的目标,因此make
推断它应该使用已经存在的 main.o
对象文件构建该目标。你可以从行中看到这一点
gcc main.o -o main
此外,您应该将 -f
标志添加到clean
目标中的 rm
命令中,以便它忽略不存在的文件(毕竟您只想清除所有内容(。
clean:
rm -f $(OBJ)
TLDR;您应该单独使用make
来构建all
目标。
有关如何构建生成文件的更多信息,请参阅此生成文件教程:http://www.gnu.org/software/make/manual/make.html#Introduction