makefile的使用总结(一)

概述

什么是makefile?
或许也有许多的程序员不知道是什么是makefile,特别是windows上开发的程序员对此应该是了解的更少了。但是我觉得作为一个合格的程序员特别是linux环境下开发的程序员,是不能不掌握makefile的。想必许多unix程序员在编译小型程序或者测试程序都写过类似 g++ test.c -o test这样的编译命令吧。但是在大型工程,特别是包含了许多源文件的时候,书写这样的编译命令是又枯燥又费时间的事情。但是让我们感到开心的事情,有了makefile,我们只需要敲一个简单的命令"make"就可以完成自动化编译,甚至可以通过输入例如"make -j 8"的命令进行多线程快速编译。
事实上,现在很多的大型项目都是通过makefile来组织的,因为掌握makefile与否,从侧面上反映了一个程序员是否具备完成大型项目的能力。

makefile简介

makefile是与make命令配合一起使用的,当输入make指令时,makefile会告诉make命令如何编译和链接程序。下面通过一个简单的例子来了解一下如何写makefile吧!

简单的makefile实例

makefile的基本书写格式如下:

target: dependencies 

[tab] system command

target即表示要生成的目标物,dependencies则表示需要生成该目标物所需要的依赖项。再下面一行则表示执行的命令,注意每一个命令都需要以一个tab键开头。
现在假设有以下几个文件需要编译:

1.main.cpp
2.add.cpp
3.sub.cpp
4.mul.cpp

如果需要在命令行中进行手动编译,则我们需要敲入如下命令:

g++ main.cpp add.cpp sub.cpp mul.cpp -o main

如果我们修改了其中的某一个源文件,则又需要再输入这么长长的命令进行编译。
按照上面给出的makefile基本的书写格式,我们可以如下书写makefile:

all:
	g++ main.cpp add.cpp sub.cpp mul.cpp -o main

在上面的makefile中,我们定义了一个名字为all的target,这也是makefile中默认的target,如果没有其他指定的target的话,则make 将会执行这个target。在这里,all之后没有指定的依赖项,所以make会直接执行第二行的g++编译命令。
像上面的这种makefile格式也有不足的地方,试想一下如果我们需要修改其中的一个文件,但是执行make的时候就会把每个文件都编译一遍,其实是没有必要的,特别是在大型项目中,有时候一整套代码编译下来需要好几个小时。这时我们就要学会使用target,而不是使用默认的target。在大部分情况下,使用多个target是有好处的,当我们修改了一个文件之后,只需要make那个相关的target就可以了。
接下来就看一下,如何把上面的例子改成多个target的形式:

all:main
main:main.o add.o sub.o mul.o
	g++ main.o add.o sub.o mul.o -o main
mian.o:main.cpp
	g++ -c main.cpp 
add.o:add.cpp
	g++ -c add.cpp
sub.o:sub.cpp
	g++ -c sub.cpp
mul.o:mul.cpp
	g++ -c mul.cpp
clean:
	rm -rf *.o main

make命令执行过程:
首先target all只有一个依赖main,事实上当前目录还没有生成该依赖,所以make会搜索main这个target,找到这个target之后,发现该target还有四个依赖,因此又会去找到这些依赖的对应的target,这些target下面又有对应依赖,例如main.cpp等源文件,这些文件都是目录下面有的,所以会执行各个target下面的命令,生成main.o等依赖,知道main这个target的所有依赖都已经生成。在这个例子中,我们看到有个名为clean的target。这个一般都是用于清理所有的objects和可执行文件。
就像任何编程语言一样,makefile也可以使用变量,有时候需要批量修改编译参数时,使用变量就会非常方便。
因此,上面的makefile也可以使用变量来改写一下。

CC = g++
CFLAGS=-c -Wall 
all:main
main:main.o add.o sub.o mul.o
	$(CC) main.o add.o sub.o mul.o -o main
main.o:main.cpp
	$(CC) $(CFLAGS) main.cpp
add.o:add.cpp
	$(CC) $(CFLAGS) add.cpp
sub.o:sub.cpp
	$(CC) $(CFLAGS) sub.cpp
mul.o:mul.cpp	
	$(CC) $(CFLAGS) mul.cpp
clean:
	rm -rf *.o main

$表示使用变量,和linux shell的语法是一样的。这样一来就明朗了,如果需要修改编译选项,就不必像使用变量之前一样一个个修改了,而只需要修改变量对应的值就可以了,非常的方便。
好了,这些只是简单的了解一下makefile,接下来的文章,我会继续详细写一下makefile的语法规则。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值