Make文件(一)
基本规则:
目标:依赖
(tab)规则
目标:需要生成的目标文件
依赖:生成该目标所需的一些文件
规则:由依赖文件生成目标文件的手段
tab:每条规则前必须以tab开头,使用空格不行。
例如:
/**
test.c
**/
#include<stdio.h>
int main()
{
printf(“this is test\n”);
return ;
}
终端编译就是:gcc test.c -o test
换成Makefile文件就是
test:test.c
gcc test.c -o test
其中第一行的test就是要生成的目标,test.c 就是依赖项,第二项就是由test.c生成的test的规则。
Makefile可以生成多个目标,但是Makefile会将第一个目标定为终极目标。
普通变量:
变量定义以及赋值:
变量直接采用赋值的方法即可完成定义;如:
INCLUDE = ./include/
变量取值:
用括号括起来再加一个美元符,如:
FOO = $(OBJ)
系统自带变量:
通常都是大写,比如CC,PWD,CFLAG,等等。
有些有默认值,有些则没有,比如:
CPPFLAGS:预处理器需要的选项 如:-I
CFLAGS:编译的时候使用参数 -Wall -g -c
LDFLAGS:链接库使用的选项 -L -I
变量的默认值可以被修改,比如CC的默认值是cc,但是可以修改为CC = gcc
自动变量:
常用的自动变量:
系统提供了很多自动变量,但常用的就是与以下三个,这些自动变量只能在规则中使用,其他地方不能使用。
$@ à规则中的目标
$< à规则中的第一个依赖项
$^ à规则中所有的依赖性
例如:
app:main.c fun1.c fun2.c
gcc $^ -o $@
其中:$^表示main.c fun1.c fun2.c,$< 表示main.c , $@ 表示app
模式规则:
模式规则是在目标及依赖条件中使用%来匹配对应的文件,比如在目录下有main.c,fun1.c,fun2.c 三个文件,对这三个文件的编译可以由一条规则完成。
%.o : %.c
$(CC) -c $< -o $@
这条模式规则表示:
main.o 由main.c 生成
fun1.o 由fun1.c 生成
fun2.o 由fun2.c 生成
这就是模式规则的作用,可以一次匹配目录下所有的文件。
函数:
makefile也为我们提供了大量的函数,同样经常使用到的函数为以下两个。
wildcard:
用于查找指定目录下指定类型的文件,跟的参数就是目录+文件类型,比如:
src = $(wildcard ./src/*.c)
这句话表示,找到./src目录下的所有文件后缀为.c的文件,并赋值给变量src
命令执行完毕后,src的值就是main.c fun1.c fun2.c
patsubst
匹配替换,例如以下例子,用于从src目录中找到所有的.c结尾的文件,并将其替换为.o文件,并赋值给obj
obj = $(patsubst %.c , %.o ,$(src))
将src变量中所有后缀为.c文件替换成.o
命令执行完成后,obj的值为main.o fun1.o fun2.o
特别的,如果想把.o文件放在obj目录下,可以用以下方法:
ob = $(patsubst ./src/%.c, ./obj/%.o, $(src))
makefile文件中所有的函数都必须有返回值。
#make all 执行生成可执行文件
#1编译器 2编译选项 3输出 4生成的可执行文件 5需要的源文件 6需要当库文件
Make文件(一)的更多相关文章
- Mapreduce的文件和hbase共同输入
Mapreduce的文件和hbase共同输入 package duogemap; import java.io.IOException; import org.apache.hadoop.co ...
- mapreduce多文件输出的两方法
mapreduce多文件输出的两方法 package duogemap; import java.io.IOException; import org.apache.hadoop.conf ...
- 01.SQLServer性能优化之----强大的文件组----分盘存储
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...
- SQL Server 大数据搬迁之文件组备份还原实战
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搬迁步骤(Procedure) 搬迁脚本(SQL Codes) ...
- SQLSERVER将一个文件组的数据移动到另一个文件组
SQLSERVER将一个文件组的数据移动到另一个文件组 有经验的大侠可以直接忽视这篇文章~ 这个问题有经验的人都知道怎麽做,因为我们公司的数据量不大没有这个需求,也不知道怎麽做实验 今天求助了QQ群里 ...
- SQL Server中的高可用性(2)----文件与文件组
在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...
- C# ini文件操作【源码下载】
介绍C#如何对ini文件进行读写操作,C#可以通过调用[kernel32.dll]文件中的 WritePrivateProfileString()和GetPrivateProfileString()函 ...
- 【小程序分享篇 一 】开发了个JAVA小程序, 用于清除内存卡或者U盘里的垃圾文件非常有用
有一种场景, 手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,所以我开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个 ...
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...
- GreenDao 数据库:使用Raw文件夹下的数据库文件以及数据库升级
一.使用Raw文件夹下的数据库文件 在使用GreenDao框架时,数据库和数据表都是根据生成的框架代码来自动创建的,从生成的DaoMaster中的OpenHelper类可以看出: public sta ...
随机推荐
- Ajax异步上传在SSM框架中的应用
最近在做毕业设计,由于毕设中要实现图片上传和视频上传的功能.突然发现原来的Form表单中的file已经满足不了我了,于是在一番折腾之后终于让我找到了一个简便的上传方式.下面来和大家分享一下我的过程. ...
- 2019中山纪念中学夏令营-Day19 数论初步【GCD(最大公约数),素数相关】
关于GCD的一些定理或运用的学习: 1. 2.二进制算法求GCD 思想:使得最后的GCD没有2(提前把2提出来) 代码实现: #include <cstdio> #define int l ...
- redmine3.4.6安装教程
Redmine 是一个开源的.基于Web的项目管理和缺陷跟踪工具. 参考了网上各种文章,终于成功安装redmine-3.4.6. 1.下载安装railsinstaller-3.4.0.exe 官网下载 ...
- @RequestMapping-限定请求方法的映射
限定请求方法的映射 测试: 如果非指定的请求方法访问时会出现405状态:
- js css3 固定点拖拽旋转
一.直接上效果图: 然后是代码: 一共两种实现方式: <!DOCTYPE html> <html lang="en"> <head> <m ...
- 04 Redis主从同步
redis主从同步 原理:1. 从服务器向主服务器发送 SYNC 命令.2. 接到 SYNC 命令的主服务器会调用BGSAVE 命令,创建一个 RDB 文件,并使用缓冲区记录接下来执行的所有写命令.3 ...
- LLVM4.0与3.5编译phase对比
说是LLVM4.0和3.5的对比,其实是Clang的4和3.5的对比.在调试Clang编译源码的过程中,发现-S选项在4.0和3.5中的处理不一样,后来使用命令验证了这个事情 jourluohua@j ...
- Linux Exploit系列之四 使用return-to-libc绕过NX bit
使用return-to-libc绕过NX bit 原文地址:https://bbs.pediy.com/thread-216956.htm 这篇讲解的比较好,主要的问题是获得system地址和exit ...
- VMware安装CentOS6.3
这里测试的是 CentOS-6.3-x86_64-bin-DVD1 链接:点击进入提取码: zs32 如果这里CentOS下载太慢的话 点击进入下载
- linux图形界面安装
1.问题现象 1.1 startx命令不可用 [root@linuxtest2 ~]# startx 1.3 init 5无法执行完成 [root@linuxtest2 ~]#init 5 2.问题原 ...