一、构建背景知识
源代码(.c,.cpp)编译生成目标代码(如:.obj,.o),目标代码链接生成可执行代码(.exe,.dll)。
对目标代码打包生成库文件(如:.lib,.a)
为了简化构建程序的过程,可以把编译和链接的指令放到一个文件中,这个文件就是makefile文件,
makefile文件最终要通过一个make工具来解释执行,不同的make工具定义的makefile文件会有不同。
二、makefile的核心规则:
target...:dependency...
command
解释:
target:执行command产生的目标
denpendency:产生target的所有依赖文件
command:shell指令,在makefile中必须以【tab】字符开始。
三、makefile中定义变量
makefile中的变量相当于宏,定义语法为:
name=value
name表示变量的名字,value表示变量的值,如:GDAL_ROOT=.
使用变量的语法为:$(name),如:CPLLIB = $(GDAL_ROOT)/port/cpl.lib
四、make工具的自动推导规则(隐式规则)
make工具有自动推导功能,比如要生成一个a.obj目标文件,make工具自动推导出需要依赖a.cpp文件,因此a.cpp在依赖的位置上可以不写。
.PHONY:clean //表示clean是个伪目标,要执行伪目标的command,需要在make工具执行的时候,显示地加上伪目标名称这个参数,如:nmake /f makefile.vc clean
clean:
-rm a.obj
五、细节
1、makefile里有什么?
makefile里包含5个部分:显式规则,隐式规则,变量定义,文件指示,注释。
显式规则:就是有makefile的作者显式指出规则的各个部分(目标,依赖,命令);
隐式规则:这个功能由make工具提供,可以省略某些依赖和命令,交由make工具自动推导。
变量定义:上面有解释,不说了。
文件指示:包含三部分:1.一个makefile包含另一个makefile,#include;2.指定makefile中的有效部分,#if;3.定义一个多行的命令
注释:以字符#开始到行尾的部分为注释
2、makefile里的通配符:
~:表示用户宿主目录,windows下表示%HOME%目录,
*:表示任意名称的文件如:*.c
?:
[...]: