linux——makefile学习
来源:互联网 发布:淘宝上买iphone7可靠吗 编辑:程序博客网 时间:2024/04/29 02:52
一、前言:
除非最简单的项目,任何一个商业项目都会包含多个源代码,而且在编译的时候会有很长很复杂的指令。 编程过程中还需要使用那些很少而且很难记忆的编译选项。 make是一种控制编译或者重复编译软件的工具。 make可以自动管理软件的编译内容、方式和时机,从而使程序员把更多的精力集中在编写代码上。
二、入门:
1、make是怎么完成工作的呢?
makefile是一个文本形式的脚本文件,其中包含一些规则告诉make编译哪些文件,怎么样编译以及在什么条件下编译。
makefile规则遵循以下通用形式
target:dependency [dependency[…]] command command […]
每个command第一个字符必须是tab键,而不是空格键,不然make会报错并停止。
用vi编辑一个简单的makefile,内容如下:
start: gcc -o hello hello.c
输入make,makefile的内容执行了。
2、稍微复杂的makefile,内容如下:
start:hello.o gcc -o hello hello.ohello.o: gcc -o hello.o -c hello.c
target start后面的hello.o代表其下的command依赖与hello.o这个target。所以make先执行了hello.o这个target下的command。
3、进一步完善的makefile,内容如下:
start:hello.o gcc -o hello hello.ohello.o: gcc -o hello.o -c hello.cclean: rm -f hello.o
增加了target clean。
输入make clean,make会直接执行clean其下的command。
4、在makefile执行shell命令:
start:hello.o gcc -o hello hello.o @echo '---------------ok---------------'hello.o: gcc -o hello.o -c hello.cclean: rm -f hello.o增加了target clean
增加了@echo,显示编译成功语句,为了不将语句本身输出,所以前面加@符号。
5、在makefile使用变量:
为了简化编辑和维护makefile,可以在makefile中使用变量。
varname=some_text
把变量用括号括起来,前面加
按照惯例makefile的变量都是大写(只是习惯而已,不是必须的)。
栗子1:
CC=gccstart:hello.o $(CC) -o hello hello.o @echo '---------------ok---------------'hello.o: $(CC) -o hello.o -c hello.cclean: rm -f hello.o
增加变量CC,每个引用变量CC的地方的展开成变量的值。
栗子2:
CC=gccSRCS=hello.cOBJS=hello.oEXEC=hellostart:hello.o $(CC) -o $(EXEC) $(OBJS) @echo '---------------ok---------------'hello.o: $(CC) -o $(OBJS) -c $(SRCS) clean: rm -f hello.o
增加变量SRCS、OBJS、EXEC,每个引用变量CC的地方的展开成变量的值。
栗子3:
CC=gccSRCS=hello.cOBJS=$(SRCS:.c=.o)EXEC=hellostart:hello.o $(CC) -o $(EXEC) $(OBJS) @echo '---------------ok---------------'hello.o: $(CC) -o $(OBJS) -c $(SRCS) clean: rm -f hello.o
OBJS=$(SRCS:.c=.o),意思是将SRCS变量中的.c替换为.o。
三、进阶
1、makefile的模式规则
.SUFFIXES:.c .o
表示任何x.c文件与x.o关联
.c.o:
表示make定义了一条规则,任何x.o文件都从 x.c编译而来
make定义了一些有用的预定义变量:
$@:规则的目标所对应的文件名$<:规则中的第一个相关文件名
在makefile使用自动变量和模式规则的例子:
.SUFFIXES:.c .oCC=gccSRCS=hello.cOBJS=$(SRCS:.c=.o)EXEC=hellostart:$(OBJS) $(CC) -o $(EXEC) $(OBJS) @echo '---------------ok---------------'.c.o: $(CC) -o $@ -c $< clean: rm -f $(OBJS)
在makefile同时编译多个源文件的例子
.SUFFIXES:.c .oCC=gccSRCS=hello.c\ pub.cOBJS=$(SRCS:.c=.o)EXEC=hellostart:$(OBJS) $(CC) -o $(EXEC) $(OBJS) @echo '---------------ok---------------'.c.o: $(CC) -o $@ -c $< clean: rm -f $(OBJS)
2、常见的make出错信息:
No rule to make target ‘target’.Stop
makefile中没有包含创建指定target所需要的规则,而且也没有默认规则可用。
‘target’ is up to date
指定的target相关文件没有变化。
command:Command not found
make找不到命令,通常是因为命令被拼写错误或者不在$PATH路径下。
- linux——makefile学习
- Linux学习——Makefile工程管理
- Linux学习笔记——Makefile教程
- LINUX学习笔记8——Makefile工程管理
- Linux学习笔记——例说makefile 综合案例
- Linux makefile学习
- linux makefile学习
- 学习 Linux的makefile
- 学习 Linux的makefile
- Linux makefile学习
- Linux Makefile 学习
- Linux Makefile学习
- Linux Makefile 学习
- linux学习笔记-makefile
- linux 学习makefile
- linux之makefile学习
- Linux 开发 | 学习 Makefile
- Linux下makefile学习
- 二分查找算法
- 免费企业内部沟通协作平台,开源企业IM,ENTBOOST,Windows环境PostgreSQL版本安装
- CSS3弹性伸缩布局(一)——box布局
- qml中关于多个MouseArea之间的事件传递(propagateComposedEvent)
- OceanBase简介
- linux——makefile学习
- HDU4277 USACO ORZ
- 你大爷永远是你大爷
- 寨卡病毒
- 质数分解
- 数据结构实验之排序二:交换排序
- Reactor & Proactor
- hashmap死循环示例及检测方法
- A+B Problem && OJ推荐