直接上例子,一眼看懂的可以忽略后面说明
.PHONY: clean test
TARGET=test
SRC=test.c
OBJS=$(SRC:.c=.o)
CC=gcc
CLFAGS=-g -O2
LIB=-L ./lib -ladd
INC=-I ./inc
$(TARGET):$(OBJS)
$(CC) -o $@ $^ $(LIB)
%.o:%.c
$(CC) -o $@ -c $^ $(INC)
clean:
rm -rf *.o $(TARGET)
说明
PHONY伪目标,为什么会有伪目标,直白点当你当前目录有一个文件叫clean,如果没有.PHONEY clean ,当你执行make clean,它并不会执行下面clean对应的rm操作;如果加上伪目标 clean,make clean会执行你makefile中clean段的内容
TARGET:目标文件名称
SRC:源文件名称
OBJS:中间文件生成规则,将所有c文件生成对应中间对象文件o这样可以省去重复的规则,比如有两个源文件文件mian.c和hello.c本来是如下规则写
main.o: main.c
cc -c main.c
hello.o: hello.c
cc -c hello.c
因为他们规则都一样,所以可以改成OBJS=$(SRC:.c=.o)
CC:指定编译工具;
CLFGAS:交叉编译的选项,这里-g生成调试信息,-O2表示优化级别为2,一般有四个优化级别,-O0表示没有优化,-O3优化级别最高,默认为-O1
LIB:-L 是lib的路径名,-l是lib文件名;
INC:-I 头文件路径名;
$(TARGET):$(OBJS):指定目标文件生成规则,注意这里有LIB,因为编译生成的中间文件最后链接需要对应引用库;
%.o:%.c:指定源文件和中间文件生成规则,如果有引用一些私有头文件,需要指定$(INC)指明头文件路径;
clean:清除生成的中间文件和最后生成的目标文件
【附】
gcc 命令的常用选项
选项 | 解释 |
---|
-ansi | 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色, 例如 asm 或 typeof 关键词。 | -c | 只编译并生成目标文件。 | -DMACRO | 以字符串"1"定义 MACRO 宏。 | -DMACRO=DEFN | 以字符串"DEFN"定义 MACRO 宏。 | -E | 只运行 C 预编译器。 | -g | 生成调试信息。GNU 调试器可利用该信息。 | -IDIRECTORY | 指定额外的头文件搜索路径DIRECTORY。 | -LDIRECTORY | 指定额外的函数库搜索路径DIRECTORY。 | -lLIBRARY | 连接时搜索指定的函数库LIBRARY。 | -m486 | 针对 486 进行代码优化。 | -o FILE | 生成指定的输出文件。用在生成可执行文件时。 | -O0 | 不进行优化处理。 | -O 或 -O1 | 优化生成代码。 | -O2 | 进一步优化。 | -O3 | 比 -O2 更进一步优化,包括 inline 函数。 | -shared | 生成共享目标文件。通常用在建立共享库时。 | -static | 禁止使用共享连接。 | -UMACRO | 取消对 MACRO 宏的定义。 | -w | 不生成任何警告信息。 | -Wall | 生成所有警告信息。 |
|