如何在Linux上为gcc做一个简单的makefile?
我有三个文件: program.c
, program.h
和headers.h
。
program.c
包含program.h
和headers.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
没有必要的生成文件。