Answers:
有趣的是,在给定有关源文件的规则的情况下,我不知道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。我求求你!:)
.PHONY: clean all default
那些打算从命令行使用的目标。另外,Autoconf / Automake还不错。当然,他们感觉很糟糕,习惯他们就像把头顶在砖墙上一样有趣,但是它们确实起作用,而且发达,并且在便携性方面将覆盖您的大部分基础,一旦您习惯了他们糟糕的设计,最终将使您的生活变得更加轻松。
rm
:stackoverflow.com/questions/2989465/rm-rf-versus-rm-rf
例如,这个简单的Makefile就足够了:
CC = gcc CFLAGS =-墙 全部:程序 程序:program.o program.o:program.c program.h headers.h 清洁: rm -f程序program.o 运行:程序 。/程序
请注意<tab>
,清洁并运行后,下一行必须有空格,不能有空格。
更新下面的注释已应用
make
不带参数通常只会构建您的软件。要运行它,请使用make run
(在此答案中可用,但不一定在所有Makefile
s中可用),或直接运行它:./program
all: program
program.o: program.h headers.h
足够。其余的是隐式的
.c
文件,则只program:
需要一个。甜蜜:)
最简单的make文件可以是
all : test
test : test.o
gcc -o test test.o
test.o : test.c
gcc -c test.c
clean :
rm test *.o
根据标头的数量和您的开发习惯,您可能需要研究gccmakedep。该程序检查您的当前目录,并将每个.c / cpp文件的标头依赖项添加到makefile的末尾。当您有2个标头和一个程序文件时,这太过分了。但是,如果您有5个以上的小测试程序,并且正在编辑10个标头之一,则可以信任make来完全重建那些由于修改而更改的程序。