我有三个文件:program.c
、program.h
和headers.h
。
program.c
包括program.h
和headers.h
。
我需要在Linux上使用gcc编译器进行编译。我不知道该怎么做。Netbeans为我创建了一个,但它是空的。
发布于 2009-09-28 00:12:27
有趣的是,我不知道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文件,您必须为每个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。我求你了!:)
发布于 2009-09-27 23:59:31
all: program
program.o: program.h headers.h
就足够了。其余的都是隐式的
发布于 2013-09-20 07:47:05
最简单的make文件可以是
all : test
test : test.o
gcc -o test test.o
test.o : test.c
gcc -c test.c
clean :
rm test *.o
https://stackoverflow.com/questions/1484817
复制相似问题