Makefile 使用小结
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 使用小结的更多相关文章
- makefile学习小结
=============2016/08/15================ 上午完成makefile的试验,缩短了代码量,现在make强大,有缺省的变量,能自己推导关系,不需要gcc –MM -M ...
- makefile实验四 编译本地的源文件 + 变量的高级主题一
<一>编译本地的源文件 + 变量的模式替换 实验代码 root@ubuntu:~/Makefile_Test/5make_test# vim makefile target := t ...
- 《UNIX环境高级编程》笔记——3.文件IO
一.引言 说明几个I/O函数:open.read.write.lseek和close,这些函数都是不带缓冲(不带缓冲,只调用内核的一个系统调用),这些函数不输入ISO C,是POSIX的一部分: 多进 ...
- Makefile小结
Makefile最基本的规则:target....:prerequisites..... command 或:target....:prerequisites.....;command target: ...
- Solaris 命令 小结
Solaris 命令 小结 prstat -a 系统进程监控 Solaris 10默认的shell是sh,可以改成bash #useradd -m -d /home/dave dave -s /bin ...
- 高通平台 lcd driver 调试小结
一.概述 1.1 简介 本文档主要包括LCD模块的驱动流程分析.Framebuffer相关知识.Gralloc等相关内容,以及LCD调试的一些经验和相关bug的分析和讲解. 1.2 开发环境 And ...
- 十天学Linux内核之第十天---总结篇(kconfig和Makefile & 讲不出再见)
原文:十天学Linux内核之第十天---总结篇(kconfig和Makefile & 讲不出再见) 非常开心能够和大家一起分享这些,让我受益匪浅,感激之情也溢于言表,,code monkey的 ...
- tiny210——uboot移植Makefile文章分析
这东西已经写,我们没有时间发布,如今,终于有时间稍微长送记录汇总uboot学习过程.具体了.以后忘了也能够再温习回来嘛有些特殊字符显示得乱掉了 Makefile追踪技巧: 技巧1:能够先从编译目标開始 ...
- LLVM小结
随笔- 5 文章- 0 评论- 10 LLVM小结 如果说gcc是FSF的传奇,llvm就是Chris Lattner的小清新.当然啦,想具体看看这位四处游山玩水还GPA 4.0的大神和他的 ...
随机推荐
- 解析Java的JNI编程中的对象引用与内存泄漏问题
JNI,Java Native Interface,是 native code 的编程接口.JNI 使 Java 代码程序可以与 native code 交互——在 Java 程序中调用 native ...
- DedeCms V5.6 plus/advancedsearch.php 任意sql语句执行漏洞
漏洞版本: DedeCms V5.6 漏洞描述: DedeCMS内容管理系统软件采用XML名字空间风格核心模板:模板全部使用文件形式保存,对用户设计模板.网站升级转移均提供很大的便利,健壮的模板标签为 ...
- 纯CSS(无 JavaScript)实现的响应式图像显示
有许多方法可以实现web页面里图像的应答.然而,我碰到的所有方案都使用了JavaScript.这使我疑惑不用JavaScript实现图像响应是否可行. 我提出了下面纯CSS的方案. 它是如何工作的呢? ...
- Android面试,BroadCastReceiver的两种注册方式的异同
在Android手机应用程序中开发中,需要用到BroadcastReceiver来监听广播的消息.在自定义好BroadcastReceiver ,需要对其进行注册,注册有两种方法: 一种是在代码当中注 ...
- 论#include
1.#include " "与#include <> #include " "表示预编译命令源程序在当前项目下寻找头文件,如果找不到,再到标准头文件 ...
- PHP快速入门 如何操作MySQL
1 创建一个新的数据库,注意类型设置为utf8_general_ci 2 在数据库中创建一个新的表,比如叫做tg_user(先从左侧选择刚才创建的数据库) 3 创建第一个字段,自动编号.我们估计网站的 ...
- 广州高清卫星地图 用百度卫星地图server下载 含标签、道路数据叠加 可商用
广州高清卫星地图的地图展示图片各自是15级别.17级别.19级别的地图.一般来说17级别的地图图片就行用于商用.地图包包括一整张高级别的图片,如要全图浏览请用专业图片处理软件PS等打开. 一般来说互联 ...
- javascript 闭包 通俗解释
代码段 function foo(){ var a = 2; function bar(){ console.log(a); } return bar; } var baz = foo(); baz( ...
- JAVA实现zip压缩需要注意的问题
近来对院社二维码平台进行2.0升级改造.于昨日踩到一个巨坑.特此记录... 需求源于院社编辑在批量下载二维码的时候,系统后台需要对所要下载的二维码进行重命名和zip打包压缩. 系统测试的时候发现:首次 ...
- 02-maven常用命令,以及使用命令创建目录
maven常用命令 mvn -v 查看maven版本 compile 编译 test 测试 package 打包 clean 删除target install 安装jar包到本地仓库中. mave ...