如何在 Linux 上为 gcc 创建一个简单的 makefile?

我有三个文件: program.cprogram.hheaders.h

program.c包括 program.hheaders.h

我需要使用 GCC编译器在 Linux 上编译它。我不知道该怎么做。Netbeans 给我做了一个,但是是空的。

266804 次浏览

例如,这个简单的 Makefile 就足够了:

CC=gcc
CFLAGS=-Wall


all: program
program: program.o
program.o: program.c program.h headers.h


clean:
rm -f program program.o
run: program
./program

注意,在清理和运行之后的下一行必须有 <tab>,而不是空格。

更新 下面的评论应用

all: program
program.o: program.h headers.h

就足够了,其余的都是不言而喻的

有趣的是,我不知道 make 会默认使用给定的源文件规则的 C 编译器。

无论如何,一个演示简单 Makefile 概念的简单解决方案是:

HEADERS = program.h headers.h


default: program


program.o: program.c $(HEADERS)
gcc -c program.c -o program.o


program: program.o
gcc program.o -o program


clean:
-rm -f program.o
-rm -f program

(记住 make 需要制表符而不是空格缩进,所以在复制时一定要修复它)

然而,为了支持更多的 C 文件,你必须为每个文件制定新的规则:

HEADERS = program.h headers.h
OBJECTS = program.o


default: program


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


program: $(OBJECTS)
gcc $(OBJECTS) -o $@


clean:
-rm -f $(OBJECTS)
-rm -f program

我试图通过省略通常在 makefile 中出现的 $(CC)和 $(CFLAGS)这样的变量来尽可能简化这个过程。如果你有兴趣弄清楚,我希望我已经给了你一个好的开始。

下面是我喜欢用于 C 源代码的 Makefile,请随意使用:

TARGET = prog
LIBS = -lm
CC = gcc
CFLAGS = -g -Wall


.PHONY: default all clean


default: $(TARGET)
all: default


OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c))
HEADERS = $(wildcard *.h)


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


.PRECIOUS: $(TARGET) $(OBJECTS)


$(TARGET): $(OBJECTS)
$(CC) $(OBJECTS) -Wall $(LIBS) -o $@


clean:
-rm -f *.o
-rm -f $(TARGET)

它使用 make 实用程序的通配符和 patsubst 特性自动包含。C 和。工作目录中的 h 文件,这意味着当你向目录中添加新的代码文件时,你不需要更新 Makefile。但是,如果要更改生成的可执行文件、库或编译器标志的名称,只需修改变量即可。

无论哪种情况,请不要使用 autoconf,我求你了! :)

根据头的数量和您的开发习惯,您可能需要调查 gcmadep。这个程序检查你的工作目录,并在 makefile 的末尾添加每个文件的头依赖项。C/cpp 文件。如果您有两个头文件和一个程序文件,那么这样做就太过分了。然而,如果你有5个以上的小测试程序,并且你正在编辑10个头中的一个,那么你可以信任 make 来重建那些被你的修改改变的程序。

最简单的 make 文件可以是

all : test


test : test.o
gcc -o test test.o


test.o : test.c
gcc -c test.c


clean :
rm test *.o