浅谈Linux下Makefile编写

浅谈Linux下Makefile的编写

前言:本文简要介绍Makefile文件的编写规范,结合具体项目中的应用进行讲解。

具体代码地址: https://github.com/AnSwErYWJ/DogFood/blob/master/Makefile

简介

Make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作。而makefile 文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。

make命令的选项与参数

-k:发生错误时任然继续执行,而不是在检测到第一个错误时停止。
-n:只输出要执行的步骤,不真正执行。
-f <filename>:告诉make命令哪个文件作为makefile文件。如果不存在就查找makefile文件,如果还不存在就查找Makefile。按惯例使用Makefile。

语法

makefile文件由一组依赖关系和规则组成。每个依赖关系由一个目标(即将要创建的文件)和一组该目标所依赖的源文件组成。

依赖关系

依赖关系定义了最终应用程序里的每个文件与源文件之间的关系。

a.out: main.o
main.o: main.c main.h

上面两行就是依赖关系:目标a.out:依赖于main.o,目标main.o依赖于main.c和main.h。所以,如果main.c和main.h发生更改,则需要重新编译整个程序。

如果需要一次创建多个目标文件,则使用为目标all:

all: a.out b.out

注意:如果未指定一个all目标,则make命令只创建makefile文件的第一个目标。

规则

规则定义了目标的创建方式。

注意:规则所在行必须以制表符tab开头。

下面就是一个简单的例子:

a.out: main.o
    gcc main.o
main.o: main.c main.h
    gcc -c main.c

make命令会自行判断文件的正确顺序,并使用给出的规则创建相应的文件,并在屏幕显示出来。如果多次编译,则make命令会读取makefile文件来确定重建目标的最少命令,而不会重复编译。

注释

makefile文件的注释以#开头,到一行的结束。

makefile文件中也可以定义宏,也可以用make命令时在命令行定义,如果需要使用文件外部定义,最好不要用空格。

#宏定义
SRC = example.c
OBJS = example.o
CC = gcc
CFALGS = -o

#宏引用
test: sqlite3.o $(OBJS)
    $(CC) $(CFALGS) test sqlite3.o $(OBJS) -ldl -lpthread

内置宏:

$?:当前目标所依赖的文件列表中比当前目标文件还要新的文件
[email protected]:当前目标的名字
$<:当前依赖文件的名字
$*:不包括后缀名的当前依赖文件的名字
-:使make忽略错误
@:执行时不将该条命令显示在标准输出

应用

下面放一个一个我写的Makefile

SRC = example.c
OBJS = example.o
CC = gcc

test: sqlite3.o $(OBJS)
    $(CC) -o test sqlite3.o $(OBJS) -ldl -lpthread
sqlite3.o: sqlite3.c sqlite3.h
    $(CC) -c sqlite3.c -o sqlite3.o
example1.o: $(SRC) sqlite3.h
    $(CC) -c $(SRC) -o example1.o

clean:
    -rm -f *.o test

反馈与建议

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 10-03

浅谈Linux下Makefile编写的相关文章

[]转帖] 浅谈Linux下的五种I/O模型

浅谈Linux下的五种I/O模型 https://www.cnblogs.com/chy2055/p/5220793.html  一.关于I/O模型的引出 我们都知道,为了OS的安全性等的考虑,进程是无法直接操作I/O设备的,其必须通过系统调用请求内核来协助完成I/O动作,而内核会为每个I/O设备维护一个buffer.如下图所示: 整个请求过程为: 用户进程发起请求,内核接受到请求后,从I/O设备中获取数据到buffer中,再将buffer中的数据copy到用户进程的地址空间,该用户进程获取到数

浅谈Linux下shell的入门与基础

1:什么是shellshell的本意是"壳"的意思,其实已经很形象地说明了shell在Linux系统中的作用.shell就是围绕在Linux内核之外的一个"壳"程序,用户在操作系统上完成的所有任务都是通过shell与Linux系统内核的交互来实现的.我们应该熟悉DOS系统中command.com程序,shell的功能与此类似,但是shell的功能更加强大,更加好用. 各种操作系统都有自己的shell.以DOS为例,它的shell就是command.com程序.DOS

linux下makefile编写及automake整理

makefile编写规则 在一个makefile中通常包含如下内容: 1 需要由make工具创建的目标体(target),通常是目标文件或可执行文件 2 要创建的目标体所依赖的文件(dependency_file) 3 创建每个目标体时需要运行的命令(command),这一行必须以制表符(tab键)开头 格式: target: dependency_files command /* 该行必须以tab键开头*/ 例如,有两个文件分别为hello.c和hello.h,创建的目标体为hello.o,执

浅谈Linux下的syslog守护进程

syslog是Linux下默认的日志守护进程.任何希望生成日志信息的程序都可以通过syslog 接口实现该目的. 同时,几乎所有的网络设备都可以通过syslog协议,将日志信息以UDP的形式传送给远端服务器,远端接收日志服务器必须通过syslogd监听UDP端口514,并根据 syslog.conf 配置文件张的配置处理.配置文件 /etc/rsyslog.conf 中规定了syslogd如何根据设备和信息的重要级别来报告信息. 这里只需要有个大致了解即可,下面都会提到这些东西. 关于配置文件:

浅谈Linux下的LAMP开发环境的搭建及discuz、phpWind、phpBB3、wordpress各种论坛博客的安装

LAMP开发可以说非常流行了,稳定安全的Linux系统和apache服务器搭配轻量级的PHP.MYSQL可以说是完美组合.可以在效率和安全性等各个方面都比ASP.NET.JSP等动态语言优胜一筹.这也是php这么流行的原因之一.说到Linux,不得不说这是一个最好用的操作系统,因为它安全,效率高,对于任何一个细节都力求做到完美.因为它是许多GEEK们汗水的结晶.那么今天所讲就是LAMP开发中最基本的就是搭建LAMP环境.在Linux下搭建该环境非常简单,可以说非常简单,没有太多环境配置的过程.可

[原创]浅谈Linux下的rpm

虽然现在很多人都使用yum去替代rpm了,但是rpm在一些特殊场合下还是有其作用的,比如查询跟验证已安装的rpm包,rpm全称Redhat Package Manager,是一种用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中,它生成具有.RPM扩展名的文件,与Dpkg类似. rpm的常用功能分两大块: (1)查询/核实软件包是否被安装:rpm {-q|--query} [select-options] [query-options]         (用的多) rpm {-V|

浅谈Linux下VIM配置

vim是从 vi 发展出来的一个文本编辑器.代码补全.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用,和Emacs并列成为类Unix系统用户最喜欢的文本编辑器.初识Linux,对于很多东西还在学习中.但是作为一个熟悉了VS编译环境的菜鸟来说,面对Linux的界面只有吐槽了...去网上搜索了一些关于vim配置的相关文档,自己进行了一些配置,当然还不禁全面,以后可以继续进行配置.下面就将自己的配置分享给大家,希望可以由一点帮助. Centos里的VI只默认安装了vim-minimal-

浅谈 Linux 下的 SSH1, SSH2

SSH:Secure Shell .是一种安全协议. 常见的应用场景是远程控制台登陆. SSH1免费,SSH2收费. 其实 SSH 并不只是在 Linux 和 Unix  下使用,他们同样在 Windows NT下广泛使用. 相对于  Telnet,ssh 对传输内容加密并压缩. SSH软件包由服务器端软件包和客户软件包组成,在windows 下服务器软件包只能运行在Windows NT及Windows 2000 Server以上的版本中,客户端无此限制. UNIX.Linux系统目前基本都带s

【linux】浅谈Linux下的 find 指令

linux中的find命令及相关实例: find指令是个使用频率比较高的命令.常用于在系统特定目录下,查找具有某种特征的文件. 一.find指令的一般格式: find [pathname] -options [-print / -ecex / -ok...] 其中: pathname表示要查找的目录    ~ 表示home目录    . 表示当前目录       / 表示根目录 [执行命令] # -options:有以下几种查找方式(按照XX查找) 名字(-name),安装权限(-perm),文