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

时间:2016-10-01 04:08:41

标签: c makefile

在程序中,我有一个list.c文件,list.h文件和run.c文件。在run.c文件中,代码包含我的主程序以及#34; #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

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

感谢您的帮助

3 个答案:

答案 0 :(得分:5)

给定的makefile正在运行并生成可执行的public static void bubbleSort(int[] A, String TipoOrdenamiento) { boolean increasingOrder = TipoOrdenamiento == "Min"; for (int i = 1; i < A.length; i++) { for (int j = A.length - 1; j >= i; j--) { if (A[j - 1] < A[j] != increasingOrder && A[j - 1] != A[j]) { int aux = A[j - 1]; A[j - 1] = A[j]; A[j] = aux; } } } } 文件。但是,lab1文件依赖于.o文件,并且不会捕获此依赖项。

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

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 %.o: %.c $(HEADERS) $(CC) -c $(CFLAGS) $< -o $@ clean: rm -fR *o lab1 列表增长,则任何标头的更改将保证重建所有 HEADERS个文件。

例如,假设我们还.o使用buf.c。现在buf.h。如果我们更改HEADERS = list.h buf.h,我们的makefile会重建buf.hlist.o,即使buf.o重建就足够了。

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

.o

答案 1 :(得分:1)

解决方案1:只需将每个.c文件单独列为输入并编译一次

gcc list.c run.c -o lab1

解决方案2:单独编译每个.c文件

gcc -c list.c
gcc -c run.c
gcc -o lab1 list.o run.o

您的项目很小且非常简单,以至于完全通用的makefile过度使用:

SOURCES = run.c list.c
CC = gcc
CFLAGS = -g -Wall

all:
    $(CC) $(CFLAGS) $(SOURCES) -o lab1

clean:
    rm -fR *o lab1

all:是一个默认目标,只需在没有参数的情况下键入make即可执行。

答案 2 :(得分:0)

编译完成后,它最终制作了一个我可以运行的lab1文件,一切正常。我的makefile最终工作正常,我完全忘记了它正在创建一个名为lab1的文件。我确实将我的makefile更改为上面的选项,这也有效。谢谢