如何在有多个文件的情况下运行C程序?

Cod*_*eak 0 c makefile

在一个程序中,我有一个list.c文件,list.h文件和run.c文件.在run.c文件中,代码包含我的主程序和"#include list.h".在我的list.h文件中,我的函数只是无效并被定义.最后,在我的list.c文件中,我再次包含list.h,并且我具有每个函数将要执行的操作的含义和代码.我制作了一个看起来像这样的makefile:

SOURCES = run.c list.c
OBJECTS= run.o list.o
HEADERS = list.h
CC = gcc
CFLAGS = -g -Wall

lab1: $(OBJECTS)
(tab)    $(CC) $(CFLAGS) $(OBJECTS) -o lab1

clean:
(tab)    rm -fR *o lab1
Run Code Online (Sandbox Code Playgroud)

我的任何代码都没有错,因为它已经完成,我只是在复制代码.但是,我不确定如何使用makefile来运行这些多个文件.在使用gcc编译并使用"./"后,我只熟悉运行程序文件.我的makefile有什么问题,或者是否有以不同方式编译这些文件的步骤?

感谢您的任何帮助

Ale*_*gue 5

给定的makefile正在运行并生成可执行lab1文件.但是,.o文件依赖于list.h文件,并且不会捕获此依赖项.

您应指定构建.o文件的目标,如下所示:

SOURCES = run.c list.c
OBJECTS= run.o list.o
HEADERS = list.h
CC = gcc
CFLAGS = -g -Wall

lab1: $(OBJECTS)
(tab)    $(CC) $(CFLAGS) $(OBJECTS) -o lab1

%.o: %.c $(HEADERS)
    $(CC) -c $(CFLAGS) $< -o $@

clean:
    rm -fR *o lab1
Run Code Online (Sandbox Code Playgroud)

注意事项:使用此makefile,如果HEADERS增长列表,任何标头中的更改都将保证重建所有 .o文件.

例如,想象一下我们也有buf.c哪些用途buf.h.现在HEADERS = list.h buf.h.如果我们改变buf.h,我们的makefile将重建两个list.obuf.o,即使buf.o重建就足够了.

为了解决这个问题,我们可以使用更详细的makefile,它使用.o以下规则标识每个文件的特定标头先决条件:

list.o: list.c list.h
    $(CC) -c $(CFLAGS) $< -o $@

buf.o: buf.c buf.h
    $(CC) -c $(CFLAGS) $< -o $@
Run Code Online (Sandbox Code Playgroud)