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

Makefile 使用小结的更多相关文章

  1. makefile学习小结

    =============2016/08/15================ 上午完成makefile的试验,缩短了代码量,现在make强大,有缺省的变量,能自己推导关系,不需要gcc –MM -M ...

  2. makefile实验四 编译本地的源文件 + 变量的高级主题一

    <一>编译本地的源文件 + 变量的模式替换    实验代码 root@ubuntu:~/Makefile_Test/5make_test# vim makefile target := t ...

  3. 《UNIX环境高级编程》笔记——3.文件IO

    一.引言 说明几个I/O函数:open.read.write.lseek和close,这些函数都是不带缓冲(不带缓冲,只调用内核的一个系统调用),这些函数不输入ISO C,是POSIX的一部分: 多进 ...

  4. Makefile小结

    Makefile最基本的规则:target....:prerequisites..... command 或:target....:prerequisites.....;command target: ...

  5. Solaris 命令 小结

    Solaris 命令 小结 prstat -a 系统进程监控 Solaris 10默认的shell是sh,可以改成bash #useradd -m -d /home/dave dave -s /bin ...

  6. 高通平台 lcd driver 调试小结

    一.概述 1.1 简介 本文档主要包括LCD模块的驱动流程分析.Framebuffer相关知识.Gralloc等相关内容,以及LCD调试的一些经验和相关bug的分析和讲解. 1.2  开发环境 And ...

  7. 十天学Linux内核之第十天---总结篇(kconfig和Makefile & 讲不出再见)

    原文:十天学Linux内核之第十天---总结篇(kconfig和Makefile & 讲不出再见) 非常开心能够和大家一起分享这些,让我受益匪浅,感激之情也溢于言表,,code monkey的 ...

  8. tiny210——uboot移植Makefile文章分析

    这东西已经写,我们没有时间发布,如今,终于有时间稍微长送记录汇总uboot学习过程.具体了.以后忘了也能够再温习回来嘛有些特殊字符显示得乱掉了 Makefile追踪技巧: 技巧1:能够先从编译目标開始 ...

  9. LLVM小结

    随笔- 5  文章- 0  评论- 10  LLVM小结   如果说gcc是FSF的传奇,llvm就是Chris Lattner的小清新.当然啦,想具体看看这位四处游山玩水还GPA 4.0的大神和他的 ...

随机推荐

  1. 从CVPR 2014看计算机视觉领域的最新热点

    编者按:2014年度计算机视觉方向的顶级会议CVPR上月落下帷幕.在这次大会中,微软亚洲研究院共有15篇论文入选.今年的CVPR上有哪些让人眼前一亮的研究,又反映出哪些趋势?来听赴美参加会议的微软亚洲 ...

  2. mac下python2.x和python3.x的安装方法和升级方法/卸载

    一.首先问个问题,我们为什么要升级python2.x或者python3.x的版本? 一个是低版本会有些bug:或者功能问题,或者安全问题等,另外高版本会引进一些新的功能,也会废弃一些老的功能. 可以通 ...

  3. linux系统编程:守护进程详解及创建,daemon()使用

    一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而且提供某种服务,不是对整个 ...

  4. PowerDesigner教程系列(二)概念数据模型

    目标:本文主要介绍PowerDesigner概念数据模型以及实体.属性创建.一.新建概念数据模型1)选择File-->New,弹出如图所示对话框,选择CDM模型(即概念数据模型)建立模型. 2) ...

  5. 《纵向切入ASP.NET 3.5控件和组件开发技术》笔记:高效率事件集合对象

    在之前讲的几个例子中,使用的是最普通的定义事件方法,比如KingTextBox中事件是这样定义的:/// <summary>/// 获得本书更多内容,请看:/// http://blog. ...

  6. 如何在CentOS 7中添加新磁盘而不用重启系统

    导读 对大多数系统管理员来说扩充 Linux 服务器的磁盘空间是日常的工作之一.因此这篇文章会通过使用 Linux 命令,在 CentOS 7 系统上演示一些简单的操作步骤来扩充您的磁盘空间而不需要重 ...

  7. 我的第一段ionic代码

    ionic是基于angularjs的前端框架,用于实现移动app. 下面是第一段代码,先贴代码,有时间再整理: demo1.htm <!DOCTYPE html> <html ng- ...

  8. 教大家如何在word 2007中同时打出对齐上下标以及字母头上有波浪线(非编辑器)

    教大家如何在word 2007中打出(非编辑器): 如果要在多个字符串上面加上划线,可以使用一下步骤 按下“Ctrl+F9”组合键,出现“{}”,在{}中输入“EQ \x\to(要加上划线的字符串)” ...

  9. javascript - 字符串比较

    1. sort是排序根据字符的ASCIll码排序的,不分字符串或其它元素(仅适用于数组) 2. split是将字符串转为数组形式 3. join是将数组转为字符串形式 4. indexOf找到元素后返 ...

  10. C++(一)——HelloWorld

    之前学C.学Python,学的比較多的是Java,作为大家口中更强大的C++,要学学,这次的话,以了解主要的特性和做个小游戏作为目标吧. 1)HelloWorld Eclipse执行C++之Launc ...