makefile
来源:互联网 发布:seo关键词优化方案案例 编辑:程序博客网 时间:2024/06/07 00:35
Linux开发工具
一、简介
1)make工具:利用make工具可以自动完成编译工作。这些工作包括:如果仅修改了某几个源文件,则只重新编译这几个源文件;如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。利用这种自动编译可大大简化开发工作,避免不必要的重新编译。
2)makefile:make工具通过一个称为Makefile的文件来完成并自动维护编译工作。Makefile文件描述了整个工程的编译、连接等规则。
二、Makefile基本规则
TARGET(target:目标)… :DEPENDENCIES(dependencies:依赖性,相关性)…
COMMAND(command:命令,指挥) …
说明:
1)目标(TARGET):即最终想要产生的文件,如:可执行文件和目标文件等;目标也可以是要执行的动作,如clean,也称为伪目标。
2)依赖(DEPENDENCIES):为了产生目标文件而依赖的文件列表,一个目标通常依赖于多个文件。
3)命令(COMMAND):是make执行的动作(shell命令或是可在shell下执行的程序)。注意:每个命令行的起始字符必须为TAB字符!(但是在CSDN上因为排版的问题,无法正常显示出来。。。)如果DEPENDENCIES中有一个或多个文件更新的话,COMMAND就要执行,这就是Makefile最核心的内容
三、一个简单的Makefile示例
.PHONY:clean #声明伪目标 phony:假的,欺骗的;假冒者
main:main.oadd.o sub.o
gcc-Wall -g main.o add.o sub.o -o main
main.o:main.c
gcc-Wall -g -c main.c -o main.o
add.o:add.cadd.h
gcc-Wall -g -c add.c -o add.o
sub.o:sub.cadd.h
gcc-Wall -g -c sub.c -o sub.o
clean:
rm-f main.o add.o sub.o
执行:
1)make #生成第一个目标
2)makeclean #“生成”clean伪目标
3)makemain.o #仅生成main.o目标
4)make-f Makefile #指定执行的文件名
四、Makefile自动化变量
选项名
作用
$@
规则的目标文件名
$<
规则的第一个依赖文件名
$^
规则的所有依赖文列表
示例:【文件名Makefile.01】
.PHONY:clean
OBJECTS=main.oadd.o sub.o#定义变量
main:$(OBJECTS)
gcc-Wall -g $^ -o main
main.o:main.c
gcc-Wall -g -c $< -o main.o
add.o:add.cadd.h
gcc-Wall -g -c $< -o add.o
sub.o:sub.cadd.h
gcc-Wall -g -c $< -o sub.o
clean:
rm-f main $(OBJECTS)
执行:make-f Makefile.01
附:如果一条语句在执行Makefile文件时,不想打印出来,则在其前面加上@符号
五、Make编译多个可执行文件
1、Make使用隐含推导
示例1:
.PHONY:cleanall
BIN=01test02test
all:$(BIN)
clean:
rm-f $(BIN)
示例2:
.PHONY:cleanall
BIN=01test02test
all:$(BIN)
01test:01test.o
gcc-Wall -g $< -o $@
02test:02test.o
gcc-Wall -g $< -o $@
clean:
rm-f $(BIN) *.o
2、模式规则
%.o:%.c
3、后缀规则
.c.o:
示例3:
.PHONY:cleanall
BIN=01test02test
all:$(BIN)
#%.o:%.c
%.c.o: #与前一条命令作用相同
gcc-Wall -g -c $< -o $@
01test:01test.o
gcc-Wall -g $< -o $@
02test:02test.o
gcc-Wall -g $< -o $@
clean:
rm-f $(BIN) *.o
六、综合运用实例
(1)
.PHONY:cleanall
CC=gcc
CFLAGS=-Wall-g
BIN=01test02test
all:$(BIN)
#%.o:%.c
.c.o:
$(CC)$(CFLAGS) -c $< -o $@
01test:01test.o
$(CC)$(CFLAGS) $< -o $@
02test:02test.opub.o
$(CC)$(CFLAGS) $< -o $@
clean:
rm-f $(BIN) *.o
(2)
.PHONY:cleanall
CC=gcc
CFLAGS=-Wall-g
BIN=01test02test 03test
STR=$(CC)$(CFLAGS) -c $< -o $@
STR2=$(CC)$(CFLAGS) $< -o $@
all:$(BIN)
clean:
rm-f $(BIN) *.o
七、make常用内嵌函数
1、函数调用
$(functionarguments) #$引用的结果就是函数生成的结果
2、Makefile下常用的函数
1)$(wildcardPATTERN) #匹配当前目录下的文件,wildcard:通配符;pattern模式
例如:src=$(wildcard*.c)
2)$(patsubstPATTERN,REPLACEMENT,TEXT) #模式替换函数,replacement 更换,复位
例如:$(patsubst%.c,%.o,$src) #等价于$(src:%.c=%.o)【推荐】
3)shell函数
执行shell命令
例如:$(shellls –d */)
八、多级目录Makefile示例
CC = gcc
CFLAGS = -Wall -g
BIN = main
SUBDIR = $(shell ls -d */) #SUBDIR保存了子文件夹
ROOTSRC= $(wildcard *.c) #ROOTSRC保存了当前目录下的.c文件
ROOTOBJ= $(ROOTSRC:%.c=%.o) #ROOTOBJ保存了将ROOTSRC中.c替换为.o文件之后的结果
SUBSRC = $(shell find $(SUBDIR) -name '*.c') #SUBSRC保存了所有子目录下的所有.c文件
SUBOBJ = $(SUBSRC:%.c=%.o) #SUBOBJ保存了将SUBSRC中.c替换为.o文件之后的结果
$(BIN):$(ROOTOBJ)$(SUBOBJ)
$(CC)$(CFLAGS) -o $(BIN) $(ROOTOBJ) $(SUBOBJ)
%.o:%.c
$(CC)$(CFLAGS) -c $< -o $@ #将所有的.c生成.o文件
clean:
rm-f $(BIN) $(ROOTOBJ) $(SUBOBJ)
http://blog.csdn.net/zjf280441589/article/details/19641443
- Makefile
- Makefile
- makefile
- makefile
- makefile
- Makefile
- Makefile
- Makefile
- Makefile
- Makefile
- Makefile
- makefile
- Makefile
- makefile
- Makefile
- makefile
- makefile
- makefile
- 我的博客今天0岁47天了,我领取了…
- network architecture 网络架构
- 老婆有外遇系列之一--亲子…
- DHCP原理
- TCP/IP协议相关——IP、TCP结构及功…
- makefile
- “ISA代理 + Windows域账…
- Tomcat 7.0用户名与密码的设置问题
- ubuntu10.04 apt源更改
- ubuntu下为apt-get设置代理
- ubuntu 10.10 vi …
- 关于用VMware安装ubuntu——连网——wi…
- jsp去除JSTL标签库"include, taglib"等留下的空白行
- 解决主能和Vmware相互之间不能复制…