1.makefile基本原理
本质就是一个脚本,这个脚本用make来执行
文件名makefile或Makefile
原理,是根据目标,执行下面的指令
目标后面如果还有依赖的目标,则先执行后面目标的指令,再执行前面目标的指令
aaa:
find ./ -name “*”
eee:rrr
ls
rrr:
echo “adfadsf”
2.基本结构 基础
可执行名:依赖的.o 依赖的库
链接
依赖的库:依赖的.o
生成库的指令
依赖的.o:
生成.o的指令
test:test.o libmplay.a
gcc -o test test.o -L./ -lmplay -lpthread
libmplay.a:mplay.o
ar -rc libmplay.a mplay.o
test.o:
gcc -o test.o -c test.c
mplay.o:
gcc -o mplay.o -c mplay.c
clean:
rm -rf *.o libmplay.a test
test:test.o libmplay.a
gcc -o test test.o -L./ -lmplay -lpthread
libmplay.a:mplay.o
ar -rc libmplay.a mplay.o
#将多个.o的目标合并在一起
test.o mplay.o:
gcc -c test.c mplay.c
clean:
rm -rf *.o libmplay.a test
2.自动推导 很少用
test:test.o libmplay.a
gcc -o test test.o -L./ -lmplay -lpthread
libmplay.a:mplay.o
ar -rc libmplay.a mplay.o
test.o mplay.o:
#此处的.o文件自动推导生成
clean:
rm -rf *.o libmplay.a test
3.使用变量
1)局部变量
SRC=test.c mplay.c
变量的取值
$(SRC) 就是 test.c mplay.c
字符串中字符的替换
SRC=test.c mplay.c
OBJ=$(SRC:.c=.o) #将变量src中的字符串的.c换为.o
makefile可写成 方法1
TAR=test
SRC=test.c mplay.c
OBJ=$(SRC:.c=.o)
LIB=-lpthread
INC=-I./
CC=gcc
$(TAR):$(OBJ)
$(CC) -o $(TAR) $(OBJ) $(LIB)
$(OBJ):
$(CC) -c $(INC) $(SRC)
clean:
rm -rf $(OBJ) $(TAR)
变量名起名
AR 代表的是库编译器 例 AR=ar
ARFLAGS 代表库编译的参数 例 ARFLAGS=-rc
AS 代表的是汇编译器 例 AS=as
ASFLAGS 代表汇编的参数
CC 代表的是标准C编译器,如 CC=gcc
CFLAGS 代表是编译.o文件时标准C参数,如 GFLAGS=-Wall -O2 -g -pipe
CXX 代表的是C++编译器 例 g++
CXXFLAGS 代表c++参数
LFLAGS 代表编译可执行文件时参数 ,如 LFLAGS=-Wall -O2 -g -pipe
LIBS 代表编译可执行文件时链接库,如 LIBS=-L./ -lm
SRCS 或 SOURCES 代表源码文件 .c或.cpp ,如 SOURCES=test.c fun.c
OBJS 或 OBJECTS 代表依赖文件.o ,如 OBJECTS=test.o fun.o
EXE 或 TARGET 代表可执行文件 ,如 TARGET=test
INPATH 或 INCLUDE 代表所需要的头文件位置,如 INCLUDE=-I./ -include "fun.h"
2)内部变量(预定义变量)
预定义变量,是脚本中具有特定意义的变量。
$* 不包含扩展名的目标文件名称,即test fun等 很少使用
- $+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。
** $< 依赖文件的名称,如test.c fun.c等 - $? 所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。
** $@ 目标的完整名称,如test.o fun.o等 - $^ 所有的依赖文件,以空格分开,不包含重复的依赖文件。
- $% 所有的库文件 .so .a 等
(1)静态模式 %
%.o:%.c
$(CC) -c $< -o $@ $(INC)
$< 所有的.c
$@ 所有的.o
makefile可写成 方法2
TAR=test
SRC=test.c mplay.c
OBJ=$(SRC:.c=.o)
LIB=-lpthread
INC=-I./
CC=gcc
$(TAR):$(OBJ)
$(CC) -o $(TAR) $(OBJ) $(LIB)
%.o:%.c
$(CC) -c $< -o $@ $(INC)
clean:
rm -rf $(OBJ) $(TAR)
(2)后缀规则
.o.c:
gcc -c $<
$< 所有的.c
makefile可写成 方法3
TAR=test
SRC=test.c mplay.c
OBJ=$(SRC:.c=.o)
LIB=-lpthread
INC=-I./
CC=gcc
$(TAR):$(OBJ)
$(CC) -o $(TAR) $(OBJ) $(LIB)
.o.c:
$(CC) -c $< $(INC)
clean:
rm -rf $(OBJ) $(TAR)
7.makefile之间的调用
-C DIRECTORY
make -C /home/ //用-C来指定编译哪个目录下的makefile
-f FILE
make -f Makefile1 //指定用哪个makefile 来编译
makefile可写成 方法4
TAR=test
SRC=test.c
OBJ=$(SRC:.c=.o)
LIB=-L./lib -lmplay -lpthread
INC=-I./lib
CC=gcc
all:creatlib $(TAR)
creatlib:
make -C ./lib
$(TAR):$(OBJ)
$(CC) -o $(TAR) $(OBJ) $(LIB)
%.o:%.c
$(CC) -c $< $(INC)
clean:cleanlib
rm -rf $(OBJ) $(TAR)
cleanlib:
make -C ./lib clean
8.qmake生成makefile
qmake是qt的工具 用来生成工程文件和makefile
//生成工程文件
qmake -project -o test.pro
//生成makefile
qmake
//编译程序
make
9.configure生成makefile