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

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

program.c包含program.hheaders.h

我需要使用gcc编译器在Linux上进行编译。 我不知道如何做到这一点。 Netbeans为我创造了一个,但它是空的。

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

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

 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 

(请记住,要求制表符而不是空格缩进,所以一定要修复时复制)

但是,要支持更多的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)这样的variables来简化这个过程。 如果你有兴趣弄清楚,我希望我已经给你一个好的开始。

这里是我喜欢用于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实用程序的通配符和patsubstfunction自动将.c和.h文件包含在当前目录中,这意味着将新代码文件添加到目录时,不必更新Makefile。 但是,如果要更改生成的可执行文件,库或编译器标志的名称,则只需修改这些variables即可。

无论如何,请不要使用autoconf。 我求你! 🙂

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

 CC = GCC 
 CFLAGS = -Wall

全部:程序
程序:program.o
 program.o:program.c program.h headers.h

清洁:
     rm -f program program.o
运行:程序
     。/程序

请注意,清理并运行后,下一行必须有<tab> ,而不是空格。

更新下面的评论应用

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

足够。 其余的是隐含的

最简单的make文件可以

 all : test test : test.o gcc -o test test.o test.o : test.c gcc -c test.c clean : rm test *.o 

根据标题数量和开发习惯,您可能需要调查gccmakedep。 这个程序检查你当前的目录,并在makefile的结尾添加每个.c / cpp文件的头文件依赖关系。 当你有2个头文件和一个程序文件时,这是矫枉过正的。 但是,如果您有5个以上的testing程序,并且您正在编辑10个标题中的一个,则可以信任make来重build那些由您的修改更改的程序。

 gcc program.c -o program 

没有必要的生成文件。