Makefile (3) 基本语法和使用
make是用来管理一个工程项目的工具 .
Makefile就是这个项目文件 .
1.Makefile 是由若干条规则组成的,每个规则的语法如下所示 :
#规则
targets: prerequisites
command
#举例 main.c func1.c
hello: main.o func1.o
gcc main.o func1.o -o hello main.o: main.c
gcc -c main.c
func1.o: func1.c
gcc -c func1.c
2.makefile的时间戳
对于已经编译过一次的工程,如果没有对源文件进行修改,目标文件是不会重复编译的,这样编译效率比较高.
也就是说,如果目标文件和依赖文件的时间戳是一样的,就不会重新编译,
如果目标文件的时间戳比依赖文件的时间戳旧,就会重新编译.
3.伪目标
对于工程的清理, 需要写一个clean功能,这种类似的功能, 不需要依赖文件,这种命令 称作 伪目标.
#伪目标
# .PHONY: xxx
.PHONY: clean
clean:
rm -rf *.o hello .PHONY: install
install:
cp hello /usr/bin .PHONY: uninstall
uninstall:
rm /usr/bin/hello
4.makefile 的变量
.用户自定义变量
.预定义变量
.自动变量
#用户自定义变量 --宏
OBJ = main.o func1.o ...
hello : $(OBJ)
gcc $(OBJ) -o hello #预定义变量
AR --> ar
CC --> 编译器
ARFLAGS --> 库编译选项
CFLAGS --> C编译器选项
#举例 CFLAGS = -g -c
gcc $(CFLAGS) func.c #自动变量
$* --> 不包含扩展名的目标文件名称 #main.o : main.c $* 表示main.o 中的main
$< --> 表示第一个依赖文件的名称
$? --> 所有时间戳比目标文件晚的依赖文件
$@ --> 目标文件的完成名称
$^ --> 所有不重复的依赖文件
# hello : main.o func1.o
# $(CC) $^ -o $@
5.makefile 条件判断
#条件判断不能用tab 打头
hello: main.o func1.o
ifeq ($(CC),gcc)
gcc $^ -o $@
else
$(CC) $^ -o $@
endif
6.Makefile的嵌套和引用
一个工程是由一层一层Makefile的嵌套组成的 .每个Makefile文件负责管理不同的部分,然后通过嵌套和引用,来管理整个工程的源码 .
#包含
include proc/makefile
#嵌套
subsystem:
$(MAKE) -C subdir
7.makefile 管理命令
| -C dir | 执行指定文件夹下面的makefile |
|---|---|
| -f file | 读入当前文件夹下的file 为 Makefile |
| -i | 忽略所有命令执行的错误 |
| -I dir | 指定被包含(include)的Makefile 的路径 |
-C 用于迭代,
/-
|-Makefile
|-srcA
| |-xx.c
| |-Makefile
|
|-srcB
|-xx.c
|-Makefile #在根目录下的Makefile
$(MAKE) -C srcA
$(MAKE) -C srcB
8.用伪目标生成多个文件
.PHONY: all
all: tar1 tar2 tar3 tar1: tar1.o
$(CC) $^ -o $@
tar2: tar2.o
$(CC) $^ -o $@ tar3: tar3.o
$(CC) $^ -o $@
Makefile (3) 基本语法和使用的更多相关文章
- Makefile规则③规则语法、依赖、通配符、目录搜寻、目标
规则语法 通常规则的语法格式如下: TARGETS : PREREQUISITES COMMAND ... 或者: TARGETS : PREREQUISITES ; COMMAND COMMAND ...
- 详解Makefile 函数的语法与使用
使用函数: 在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能.make所支持的函数也不算很多,不过已经足够我们的操作了.函数调用后,函数的返回值可以当做变量来使 ...
- 详解Makefile 函数的语法与使用 (转)
使用函数: 在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能.make所支持的函数也不算很多,不过已经足够我们的操作了.函数调用后,函数的返回值可以当做变量来使 ...
- 【 MAKEFILE 编程基础之四】详解MAKEFILE 函数的语法与使用!
本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/gcc-makefile/771.html ...
- [转]Windows平台下Makefile学习笔记
Windows平台下Makefile学习笔记(一) 作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译 ...
- make命令以及makefile
make命令以及makefile使用RCS与CVS进行源代码控制编写手册页使用patch与tar发布软件开发环境 多源代码的问题 当我们编写小程序时,许多人都是简单的在编辑后通过重新编译所有的文件重新 ...
- 转载-------makefile 使用总结
转载自:http://www.cnblogs.com/wang_yb/p/3990952.html 1. Makefile 简介 Makefile 是和 make 命令一起配合使用的. 很多大型项目的 ...
- Linux内核Makefile文件(翻译自内核手册)
--译自Linux3.9.5 Kernel Makefiles(内核目录documention/kbuild/makefiles.txt) kbuild(kernel build) 内核编译器 Thi ...
- (二)我的Makefile学习冲动&&编译过程概述
前言 一 年轻的冲动 二 学习曲线 1 Makefile基本语法 2 bash基础 3 world 三 编译过程概述 1 主机预装工具 2 编译host工具 3 编译交叉工具链 4 编译内核模块 5 ...
随机推荐
- System Center Configuration Manager 2016 必要条件准备篇(Part4)
步骤4.重新启动Configuration Manager主服务器 注意:在Configuration Manager服务器(CM01)上以本地管理员身份执行以下操作 打开管理命令提示符并发出以下 ...
- java集合框架——Set
一.Set概述 Set集合的特点是元素不允许重复,而且是无序的(添加和取出的顺序不一致). Set接口中的方法和Collection接口中的方法几乎相同,略. Set接口下常用的两个类:HashSet ...
- Ubuntu 如何将桌面上的Home中的文件夹除去
安装Ubuntu后, 由于无法用Terminal(终端)进入带中文的文件夹,会引起很多操作不便.很多朋友想到了将它们都改成中文,但是当再次开机重启使却会发现,原本光洁的桌面现在竟然出现了一堆文件夹?? ...
- 会说话的ABAP report
report z. INCLUDE ole2incl. DATA: ole TYPE ole2_object, voice TYPE ole2_object, text ...
- Jenkins配置(Jenkins如何与maven项目进行连用)
一同事,在问关于Jenkins搭建后,他是如何与我们项目进行连用的,如何通过Jenkins去编译我们的项目的,现在介绍下如何通过Jenkins持续编译我们的项目 配置过程 1.确定我们已经搭建好了Je ...
- 【CCPC-Wannafly Winter Camp Day4 (Div1) G】置置置换(动态规划)
点此看题面 大致题意: 求出有多少个长度为\(n\)的排列满足对于奇数位\(a_{i-1}<a_i\),对于偶数位\(a_{i-1}>a_i\). 考虑打表? 考虑每次只有一个数\(n\) ...
- 课程设计__继承与派生,重载<<
///继承与派生 #include <iostream> using namespace std; class Point { public: Point (,):x(a),y(b) {} ...
- python遇到IndentationError: unexpected indent
由于tab和空格混用而导致的问题,解决办法如下: 在SubLime中View中的Identation中的Convert Indentitation to Spaces即可
- Python 爬虫的工具列表
这个列表包含与网页抓取和数据处理的Python库 网络 通用 urllib -网络库(stdlib). requests -网络库. grab - 网络库(基于pycurl). pycurl - 网络 ...
- PRmakefile文件
Ubuntu下的makefile: # /******************************************************************************* ...