linux ——make
2016-07-10 20:42
393 查看
工程管理器 make (来自GNU计划)
在运用Make工程管理器时我们会发现最重要的部分就是编写Makefile,在提到make时候我们更多也更加习惯地提到Makefile。我们在做一个工程时会编写很多的源文件,如果用gcc编译的话编译速率太慢效率太低,这时候全自动的Make工程管理器就能带来很大的便利。
Make为什么被称为全自动化的编译器?
1)、按规则编译使用方便:通过命令”make”即可启动编译,Make工程管理器就根据规则文件Makefile来编译
2)、按时间戳编译调试效率高:Make会自动检查每个源文件的时间戳的时间,如果发现时间更新就编译该文件,如果时间戳没变就不再编译该文件
Makefile
组成部分:
目标文件:依赖文件
<Tab>编译规则命令行
编写程序模拟一个实现加减乘除功能的计算器并用Make工程管理器实现多个源文件的调试
功能块源文件组成:add.csub.c mul.c div.c main.c
功能目录组成:add submul div test scripts Makefile
tree型目录
|-- Makefile
|-- add
| |-- Makefile
| `-- src
| |-- add.c
| `-- add.o
|-- cal
|-- div
| |-- Makefile
| `-- src
| |-- div.c
| `-- div.o
|-- mul
| |-- Makefile
| `-- src
| |-- mul.c
| `-- mul.o
|-- scripts
| `--Makefile
|-- sub
| |-- Makefile
| `-- src
| |-- sub.c
| `-- sub.o
`-- test
|-- Makefile
`-- src
|-- main.c
`-- main.o
scripts /Makefile(在脚本功能目录下的Makefile主要进行一些变量赋值,在编写时编者需要了解基本的赋值语句,在这里以#开头均为注解)
CC := gcc
CFLAGS := -Wall -O3
Libs = -lpthread
Target := cal
#目标文件名
Source := $(wildcard src/*.c)
#将所有src 目录下.c文件存放到Source变量中去
Objs := $(patsubst %.c,%.o,$(Source))
#将Source中.c文件编译成.o文件并存放到Objs变量中
Modules += add sub mul div test
#将所有的功能目录存放到Modules变量中
AllObjs := $(addsuffix /src/*.o,$(Modules))
#依次将Modules中存放的目录下的src目录下的.o文件存放到AllObjs中
总控Makefile (在总控Makefile中主要执行进入各个子目录中读取Makefile并进行make编译的嵌套功能)
include scripts/Makefile
modules_make = $(MAKE) -C $(1);
#嵌套执行,读取子目录的Makefile并执行make命令
modules_clean = $(MAKE) clean -C $(1);
#进入子目录并进行clean操作
.PHONY: all mm mc clean
all: $(Target)
mm:
@$(foreach n,$(Modules),$(call modules_make,$(n)))
#先将Modules中存放的目录循环依次传送到变量n中,然后再将n中内容依次复制给参数modules_make中的变量$(1),$(2)
mc:
@$(foreach n,$(Modules),$(call modules_clean,$(n)))
#先将Modules中存放的目录循环依次传送到变量n中,然后再将n中内容依次复制给参数modules_clean中的变量$(1),$(2)
$(Target) : mm
$(CC)$(CFLAGS) -o $(Target) $(AllObjs) $(Libs) # 编译成可执行文件gcc –Wall–o3 –o cal add.o sub.o mul.o div.o main.o -lpthread
@echo $(Target) make done! #打印 cal make done!
clean : mc
rm-rf $(Target)
#清除目标文件中的.o文件
@echo clean done! #打印 clean done!
功能块Makefile (在各个独立的子功能块编写Makefile文件)
include ../scripts/Makefile
all:$(Objs) #gcc –c ./src /.c文件 –o .o文件
clean:
rm-rf $(Objs)
#删除各目录下目录src中的.o文件
工程管理器 make (来自GNU计划)
在运用Make工程管理器时我们会发现最重要的部分就是编写Makefile,在提到make时候我们更多也更加习惯地提到Makefile。我们在做一个工程时会编写很多的源文件,如果用gcc编译的话编译速率太慢效率太低,这时候全自动的Make工程管理器就能带来很大的便利。
Make为什么被称为全自动化的编译器?
1)、按规则编译使用方便:通过命令”make”即可启动编译,Make工程管理器就根据规则文件Makefile来编译
2)、按时间戳编译调试效率高:Make会自动检查每个源文件的时间戳的时间,如果发现时间更新就编译该文件,如果时间戳没变就不再编译该文件
Makefile
组成部分:
目标文件:依赖文件
<Tab>编译规则命令行
编写程序模拟一个实现加减乘除功能的计算器并用Make工程管理器实现多个源文件的调试
功能块源文件组成:add.csub.c mul.c div.c main.c
功能目录组成:add submul div test scripts Makefile
tree型目录
|-- Makefile
|-- add
| |-- Makefile
| `-- src
| |-- add.c
| `-- add.o
|-- cal
|-- div
| |-- Makefile
| `-- src
| |-- div.c
| `-- div.o
|-- mul
| |-- Makefile
| `-- src
| |-- mul.c
| `-- mul.o
|-- scripts
| `--Makefile
|-- sub
| |-- Makefile
| `-- src
| |-- sub.c
| `-- sub.o
`-- test
|-- Makefile
`-- src
|-- main.c
`-- main.o
scripts /Makefile(在脚本功能目录下的Makefile主要进行一些变量赋值,在编写时编者需要了解基本的赋值语句,在这里以#开头均为注解)
CC := gcc
CFLAGS := -Wall -O3
Libs = -lpthread
Target := cal
#目标文件名
Source := $(wildcard src/*.c)
#将所有src 目录下.c文件存放到Source变量中去
Objs := $(patsubst %.c,%.o,$(Source))
#将Source中.c文件编译成.o文件并存放到Objs变量中
Modules += add sub mul div test
#将所有的功能目录存放到Modules变量中
AllObjs := $(addsuffix /src/*.o,$(Modules))
#依次将Modules中存放的目录下的src目录下的.o文件存放到AllObjs中
总控Makefile (在总控Makefile中主要执行进入各个子目录中读取Makefile并进行make编译的嵌套功能)
include scripts/Makefile
modules_make = $(MAKE) -C $(1);
#嵌套执行,读取子目录的Makefile并执行make命令
modules_clean = $(MAKE) clean -C $(1);
#进入子目录并进行clean操作
.PHONY: all mm mc clean
all: $(Target)
mm:
@$(foreach n,$(Modules),$(call modules_make,$(n)))
#先将Modules中存放的目录循环依次传送到变量n中,然后再将n中内容依次复制给参数modules_make中的变量$(1),$(2)
mc:
@$(foreach n,$(Modules),$(call modules_clean,$(n)))
#先将Modules中存放的目录循环依次传送到变量n中,然后再将n中内容依次复制给参数modules_clean中的变量$(1),$(2)
$(Target) : mm
$(CC)$(CFLAGS) -o $(Target) $(AllObjs) $(Libs) # 编译成可执行文件gcc –Wall–o3 –o cal add.o sub.o mul.o div.o main.o -lpthread
@echo $(Target) make done! #打印 cal make done!
clean : mc
rm-rf $(Target)
#清除目标文件中的.o文件
@echo clean done! #打印 clean done!
功能块Makefile (在各个独立的子功能块编写Makefile文件)
include ../scripts/Makefile
all:$(Objs) #gcc –c ./src /.c文件 –o .o文件
clean:
rm-rf $(Objs)
#删除各目录下目录src中的.o文件
相关文章推荐
- linux - 理解inode
- Linux系统查看系统是32位还是64位方法总结(转)
- linux关于readlink函数获取运行路径的小程序
- CentOS运维的日常系统管理
- Linux系统有线连接校园网
- Linux文件系统基础(5)
- ubuntu/linux terminal打开指定文件夹 当前文件夹打开终端
- linux终端输出彩色字体
- JDK的windows和Linux版本之下载
- 闲话Linux系统安全(二)——强制访问控制(MAC)
- Linux下查看、关闭及开启防火墙命令
- Linux命令(005) -- kill、pkill和killall的比较
- Linux唤醒抢占----Linux进程的管理与调度(二十三)
- Linux学习——NFS自动挂载
- linux arm移植触摸屏tslib
- Centos6.5安装mysql不能启动,应该安装mysql-server
- Linux服务器,PHP的10大安全配置实践
- ASP.NET Core 发布至Linux生产环境 Ubuntu 系统
- Linux进程上下文切换过程context_switch详解--Linux进程的管理与调度(二十一)
- Linux用户抢占和内核抢占详解(概念, 实现和触发时机)--Linux进程的管理与调度(二十)