makefile文件编写
基本语法
target: components 目标文件: 依赖文件
comand (tab)编译规则
例子1:
SRC_O :main.o mytool1.o mytool2.o
main:$(SRC_O)
gcc -o main $(SRC_O)
main.o:main.c mytool1.h mytool2.h
gcc -c main.c
mytool1.o:mytool1.c mytool1.h
gcc -c mytool1.c
mytool2.o:mytool2.c mytool2.h
gcc -c mytool2.c
clean:
rm -rf *.o main
规则
$@ 目标文件
$^ 所有的依赖文件
$< 第一个依赖文件
简化后:
main:main.o mytool1.o mytool2.o
gcc -o $@ $^
.c.o:
gcc -c $<
clean:
rm -rf *.o main
例子2:
main:main.o add.o mul.o sub.o div.o
g++ -o main add.o mul.o sub.o div.o main.o
main.o:main.cpp
g++ -c -I ../include main.cpp
add.o:add.cpp ../include/head.h
g++ -c -I ../include add.cpp
mul.o:mul.cpp ../include/head.h
g++ -c -I ../include mul.cpp
sub.o:sub.cpp ../include/head.h
g++ -c -I ../include sub.cpp
div.o:div.cpp ../include/head.h
g++ -c -I ../include div.cpp
.PHONY:clean
clean:
rm -f *.o
#获取.cpp文件
#wildcard函数,就是获取指定的文件
SrcFiles=$(wildcard *.cpp)
#使用替换函数获取.o文件
#patsubst函数,有替换功能。
ObjFiles=$(patsubst %.cpp,%.o,$(SrcFiles))
#生成的可执行文件
all:main
#目标文件依赖于.o文件
main:$(ObjFiles)
g++ -o $@ -I ../include $(SrcFiles)
#.o文件依赖于.cpp文件,通配使用,一条就够
%.o:%.cpp
g++ -c -I ../include $<
.PHONY:clean all
clean:
rm -f *.o
$(Files),取File变量的值。
$@ 目标文件
$^ 全部依赖
$< 第一个依赖
$? 第一个变化的依赖
例子3:
src = $(wildcard ./*.c) #获取当前.c文件
obj = $(patsubst %.c, %.o, $(src)) #patsubst 替换通配符, 代表将src里的每个文件都由.c替换成.o。函数执行结束后,obj的值为main.o fun1.o fun2.o,其实跟第三版Makefile的obj值一模一样,只不过在这里它更智能一些,也更灵活。
#obj = $(src:%.c=%.o) 这样写也行
target = app
CC = gcc
$(target): $(obj)
$(CC) $(obj) -o $(target)
%.o: %.c
$(CC) -c $< -o $@
.PHONY: clean
clean:
rm -rf $(obj) $(target)