我有三个文件: program.c,program.h和 headers.h。
program.c
program.h
headers.h
program.c包括 program.h和 headers.h。
我需要使用 GCC编译器在 Linux 上编译它。我不知道该怎么做。Netbeans 给我做了一个,但是是空的。
例如,这个简单的 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>,而不是空格。
<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