Makefile介绍和编写

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行走在软件开发路上的人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值