当我们的工程越来越大的以后,每次都使用命令编译显得非常的麻烦.所以我们需要一个自动化编译的工具来帮助我们编译.在我们使用源码安装软件的时候都会有make,make install等操作,这个就是使用Makefile来进行自动化编译的工作的.

Makefile也是一个脚本文件和shell脚本非常的相似,但是也有很多的地方不一样.

程序编译通常会有一下几个步骤,先是预编译,然后将C语言代码编译成汇编,然后在将汇编编译成二进制文件.o文件,然后将所有的.o文件连接起来就得到了可执行文件.

在编写Makefile时,我们先将所有的c语言代码编译成二进制文件,然后将所有二进制文件链接起来.

和shell类似的,里面有变量,有命令,有循环,判断等语句,所有的命令都需要另起一行,而且开始必须是tab键(所有开头是tab键的行都会被认为是命令,哪怕不能执行),变量等必须顶行不能有空格等.

简单的Makefile格式(不涉及循环,选择等语句):

TARGET... : PREREQUISITES...

COMMAND

a:main.o

gcc -o main.o

main.o:main.c

gcc -c main.c

这样就是一个最简单的Makefile

当然我们如果是文件多的话这样写就非常的麻烦,我们就可以使用 变量名 += .....来进行编辑,使用时直接$(变量名)来使用.(和shell一样)

我们也常常会使用make clean的命令等,这个叫做伪目标,直接

clean:

rm *.o

install:

cp .. /bin

Makefile文件也可以应用其他的Makefile文件

include 文件名

在我们写了.o文件名以后,当.o和.c文件是同名时,我们也可以不用.c文件,make会自动查找同名的文件,例如%.o:%.c.

以下是一些自动化变量:

$@

表示规则的目标文件名。如果目标是一个文档文件(Linux中,一般称.a文件为文档文件,也称为静态库文件) ,那么它代表这个文档的文件名。在多目标模式规则中,它代表的是哪个触发规则被执行的目标文件名。

$%

当规则的目标文件是一个静态库文件时,代表静态库的一个成员名。例如,规则的目标是 “foo.a(bar.o)” , 那么, “$%” 的值就为 “bar.o” , “$@” 的值为“foo.a” 。

如果目标不是静态库文件,其值为空。

$<

规则的第一个依赖文件名。 如果是一个目标文件使用隐含规则来重建, 则它代表由隐含规则加入的第一个依赖文件。

$?

所有比目标文件更新的依赖文件列表,空格分割。如果目标是静态库文件名,代表的是库成员(.o文件) 。

$^

规则的所有依赖文件列表,使用空格分隔。如果目标是静态库文件,它所代表的只能是所有库成员(.o文件)名。一个文件可重复的出现在目标的依赖中,变量“$^”只记录它的一次引用情况。就是说变量“$^”会去掉重复的依赖文件。

$+

类似“$^” ,但是它保留了依赖文件中重复出现的文件。主要用在程序链接时库的交叉引用场合。

$*

在模式规则和静态模式规则中,代表“茎” 。 “茎”是目标模式中“%”所代表的部分 (当文件名中存在目录时, “茎” 也包含目录 (斜杠之前) ) 。例如:文件“dir/a.foo.b” ,当目标的模式为“a.%.b”时,“$*”的值为“dir/a.foo” 。 “茎”对于构造相关文件名非常有用

以下是一般的简单的Makefile写法:

COBJS += main.o

#CFLAGS += -O2 -Wall -DDEBUG

CFLAGS+= -I./

LDFLAGS+= -lmxml -lpthread

CROSS_COMPILE?=

CC = $(CROSS_COMPILE)gcc

TARGET = tag

all:$(TARGET)

$(TARGET):$(COBJS)

$(CC) -o $@ $^ $(LDFLAGS)

%.o:%.c

$(CC) $(CFLAGS) -c -o $@ $^ $(LDFLAGS)

.PHONY:clean

clean:

rm -f $(COBJS)

编写简单的hql命令_Makefile的简单编写相关推荐

  1. linux命令编写,编写简单的linux命令

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 又到了周四分享环节,鉴于最近在看linux编程实践,所以就的讲一下如何编写一个简单的who命令. PPT Manual ...

  2. 简单的Dos命令/一行代码实现恶意程序

    申明:本文章仅供学习使用 今天讲一些简单的Dos命令,并且利用Dos做一个简单的恶意代码,并且不断进行完善. dir查看目录内容命令 dir/s列出所有文件以及子目录 dir/a列出所有文件,包括隐藏 ...

  3. [网络安全学习篇2]:IP详解及简单的DOS命令(千峰网络安全视频笔记 2 day)

    引言:我的系列博客[网络安全学习篇]上线了,小编也是初次创作博客,经验不足:对千峰网络信息安全开源的视频公开课程的学习整理的笔记整理的也比较粗糙,其实看到目录有300多集的时候,讲道理,有点怂了,所以 ...

  4. python 编写查字典程序,Python_字典实现简单预约系统

    Python_字典实现简单预约系统 Python_字典实现简单预约系统 编写主程序 使用while循环实现程序一直运行,用户输入字符数字进行判断通过if-elif-else语句控制进入不同的函数,实现 ...

  5. 你知道吗?Linux命令竟如此简单!

    你知道吗?Linux命令竟如此简单! 我Linux安完了,如何快速入门? 1.进入终端 2.好了,入门完了 咳 咳 开个玩笑 2.1查看磁盘容量 2.2新建 2.3查看&删除 2.5解压&am ...

  6. 简单的DOS命令操作数据库

    简单的DOS命令操作数据库 启动服务:net start 数据库服务名字 关闭服务:net stop 数据库服务名字 连接数据库:mysql -u用户名 -p密码 show databases -- ...

  7. 【我的区块链之路】- Hyperledger fabric的简单入门(四)链码的编写及调试

    [我的区块链之路]- Hyperledger fabric的简单入门(四)链码的编写及调试       之前的文章中我们有讲过了fabric的一些核心的配置文件的选项说明,讲过fabric 的网络启动 ...

  8. linux脚本求命令行上整数和,shell脚本--cut命令与awk简单使用

    cut:对内容进行列切割 -d 后面的是分割符,表示用什么符号来分割符来分割列,分隔符使用引号括起来: -f后面跟着要选择的字段列,从1开始,表示第一列,如果要多列,可以用逗号分隔 : -c参数后面跟 ...

  9. 浅谈Git的基本工作流程与简单的Git命令

    浅谈Git的基本工作流程与简单的Git命令 什么是GIT? 定义:是一个开源的分布式版本控制工具 功能: 代码备份 版本控制 协同开放 代码追溯 场景: 团队协同开放项目 Git仓库工作流程 Git常 ...

最新文章

  1. Hello World程序里居然有bug!
  2. Linux下得到显示屏参数的方法
  3. Win64 驱动内核编程-24.64位驱动里内嵌汇编
  4. 之前写的h5css3动画——月食
  5. pygame只能编写游戏_游戏框架搭建
  6. 前端学习(2734):重读vue电商网站44之使用 echarts
  7. 表格数字乘以百分比怎么算_EXCEL记住这两个快捷键,1秒种设好数字格式
  8. mysql多数据源_egg-mysql配置多数据源
  9. mysql sql语句集合
  10. 12通过作用域链实现闭包
  11. 在线编辑Word——插入图表
  12. 银行软件测试测试用例,银行测试用例设计经验总结,应该怎样去设计测试用例?...
  13. vue-baidu-map 百度地图(定位替换图标,添加标签)
  14. 易懂介绍Java中类与对象、构造方法、继承
  15. html5手机远程控制电脑,教你怎么用手机远程控制电脑
  16. 南京邮电大学操作系统实验五:Windows平台多进程共享内存通信
  17. 如何彻底关掉pycharm的警告
  18. 某省住房和城建网的AES加密
  19. CNN中receptive field
  20. 总结linux FHS结构

热门文章

  1. TIOBE 4 月榜单:上古编程语言 Fortran 击败 Objective-C,PHP、Go 下滑
  2. GitHub 超 20000 Star,最火开源视频库 FFmpeg 这 20 年!
  3. Python 之父 Guido van Rossum 退休失败,正式加入微软搞开源!
  4. 2020中国移动创客马拉松大赛移动云专题赛决赛成功举办
  5. 英特尔、阿里巴巴全方位深化技术创新,共同引领数智未来
  6. 1 月以来 Tether 增发 47 亿 USDT,美元都去哪儿了?
  7. 如何用 Python 画一个纸飞机?| 原力计划
  8. Libra 新编程语言 :Move 所有权模型灵感竟是来自它……
  9. 12306 出招抢票软件,技术黄牛生意要“黄”?
  10. 你想进BAT吗?告诉你一个秘密,面试成功率能提高到99%!