Makefile的基本格式

#目标:依赖(条件)

# 命令

#all: add.c sub.c dive.c mul.c main.c

# gcc add.c sub.c div.c mul.c main.c -o app

app:add.o sub.o dive.o mul.o main.o

gcc add.o sub.o

add.o:add.c

gcc -c add.c gcc -c 只编译,不链接

sub.o:sub.c

gcc -c sub.o

dive.o:dive.c

gcc -c dive.c

Makefile 执行的两个阶段:

第一个阶段,自上向下建立关系树

第二个阶段, 自下向上执行命令

-------------------------------------------------

Makefile 项目管理工具

节省项目编译时间

只编译已经修改的文件

一次编写 终身受益

程序运行出错的返回值都会保存在$?里面,可以通过

echo $?来查看

1.调用make命令来调用Makefile文件,当敲make会自动到当前目录下找Makefile

2.在Makefile里面#代表注释

3. 所有命令前面必须有一个TAB空格键

4. 如果这个目标不依赖任何文件,则在定义目标之后,可以直接跟命令

clean:

rm *.o

rm app

5. make时候如果不带任何参数,则默认会执行第一个目标, 如果想执行clean目标,则需要手动指定clean目标:make clean (如果当前目录下已经存在clean文件,则不再执行clean命令)

解决办法:可以声明一个伪目标

.PHONY:clean

clean:

rm -f *.o

rm -f app

6. 如果想让Makefile 在执行命令出错的时候,不退出,则需要在命令前面加上’’-’’,如:

  • rm add.o

所以完整写法为:

-rm -f *.o

-rm -f app

7. 如果不想看到Makefile输出的命令,可以在命令前面加上”@”符号

test:

@echo “hello”

8. Makefile中还可以定义变量,当要引用变量时候,可以$(变量名)来引用

obj=add.o sub.o mul.o dive.o main.o

app:$(obj)

gcc $(obj) -o app

9. Makefile有内建语法规则,make -P

$@表示目标, $^表示所有依赖, $<表示依赖中的第一个

#如果遇到后缀名为.o的文件,就依赖于同名的后缀名为.c的文件

%.o:%.c

gcc -c $<  -o $@

#wildcard 可以打到当前目录下所有以.c结尾的文件名

src  = $(wildcard *.c);

#patsubst 是一个字符串替换函数,意思就是说要把$(src)变量里面所有的以.c结尾的文件替换成.o结尾的文件(注意!只是文件名替换,没有生成.o文件);

obj = $(patsubst %.c,%.o,$(src));

target = app

$(target):$(obj)

gcc $^ -o $@

10. Makefile 常用变量(增加编译时的调试标志)

#预处理器标志(头文件)

CPPFLAGS= -Iinclude

# 编译的时候是否需要加调试信息

CFLAGS= -g -Wall

# 指定编译时的共享库

LDFLAGS= -L../lib -lmycalc

# 指定编译器

CC=gcc

$(CC) -c $< $(CFLAGS) $(CPPFLAGS) -o $@

11.

#彻底清除生成过程文件和生成配置文件

distclean:

install:

12 make -C 进入指定目录,调用里面的Makefile

make -C src

进入src这个目录,调用src目录里面的Makefile

最新文章

  1. wamp环境 安装memcache 扩展
  2. javascript 手势缩放 旋转 拖动支持:hammer.js
  3. Windows Linux 之间rsync同步CODE文件
  4. [LeetCode][Java]Triangle@LeetCode
  5. he time that it takes to bring a block from disk into main memory
  6. java获取任意日期
  7. URAL 2070 Interesting Numbers (找规律)
  8. 东芝超级本从win8到win7
  9. tq --uboot使用
  10. SQL in查询报告类型转换失败的3种解决办法
  11. Go语言学习笔记(六)net
  12. Dynamics Crm 2011 Or 2013 IFD 部署一段时间后,CA验证问题
  13. GhostCore核心使用完全指南 - 传送门
  14. python 报错 TabError: inconsistent use of tabs and spaces in indentation
  15. TensorFlow环境搭建
  16. BZOJ1146[CTSC2008]网络管理——出栈入栈序+树状数组套主席树
  17. 第 4 章 容器 - 028 - 限制容器对CPU的使用
  18. 方法装饰器(Decorator)
  19. handsontable 排序问题
  20. 帝国cms的list.var中使用php函数

热门文章

  1. 如何将js的object对象传到后台---&gt;JavaScript之对象序列化
  2. [Android Pro] android root权限破解分析
  3. ChartView与LineSeries搭配实现曲线局部缩放功能
  4. M1卡说明及使用proxmark3破解方法
  5. 使用C# + httpWebRequest 解析WMTS服务元数据
  6. 用asp.net还原与恢复sqlserver数据库
  7. Win下执行Swing程序的BAT文件 和 Linux下执行Swing程序的SH文件
  8. python xlrd简单读取excel
  9. binlog的几种复制形式
  10. STL - 常用顺序容器代码