- 作者:zhaozj
- 发表时间:2020-12-23 10:55
- 来源:未知
make命令时gnu组织提供的创建软件包的命令。在执行make时,它会自动寻找Makefile或者makefile文件,并执行其中定义的创建过程。makefile文件支持shell编程的语法,由一组创建软件包的规则组成,规则的格式如下:target : dependency dependency [...] command command [...]target表示make命令要执行的目标。dependency表示执行该目标时需要依赖的对象,多个依赖对象之间使用空格符隔开。command表示执行目标时使用的命令,多个comman是使用多行表示。需要注意的是,command行之前必须留有8个字符的空格,也就是一个tab键所占的长度,否则,Makefile文件常常被认为已经损坏、无法使用。编写makefile时的通常的方法:一、定义变量定义变量可以让makefile文件看起来显得更简洁和规范,变量的定义遵循shell编程规范。比如:CC = g++C = gcc再定义一个源文件变量:SOURCES = main.cpp precompile.cpp如果你想在结尾换行换行,那么就在结尾加上反斜杠“/",比如:SOURCES = main.cpp/ precompile.cpp二、定义创建规则将变量按照需要组合,按照创建规则的格式书写出来,就可以形成完整的makefile文件了。比如:${OBJECTS} : ${SOURCES} $(CC) -c $(CFLAGS) $(INCLUDES) ${SOURCES}这个规则的意思是:要创建${OBJECTS},不仅需要依赖${SOURCES},还要执行命令$(CC) -c $(CFLAGS) $(INCLUDES) ${SOURCES},这个规则中的$(XX)都表示引用我们刚才定义的变量。
下面用一个简单的实例讲一下如何制作一个makefile,期间我会使用注释(#)进行讲解。
#定义编译器的命令名变量。CC=g++
#定义编译器选项变量。CFLAGS = -g
#定义include文件或文件夹变量,#-I表示include选项,-I之后的include的实际内容。INCLUDES = -I. -I/usr/lib
#定义库文件或文件夹变量。LIBS = -L.
#定义输出文件名PRG = testit
#定义源文件列表变量,多个文件安直接使用空格分开。SOURCES = main.cpp/ precompile.cpp
#定义目标文件列表变量,多个文件安直接使用空格分开,#文件的先后顺序要与定义SOURCES变量时一致。OBJECTS = main.o/ precompile.o#规则all,它依赖于${PRG}规则,没有执行命令。all : ${PRG}
#规则${PRG},它依赖于${OBJECTS}规则,#并执行将目标文件连接成程序文件的命令。${PRG} : ${OBJECTS} ${CC} -o ${PRG} ${OBJECTS} ${LIBS}#规则${OBJECTS},它依赖于${SOURCES}变量,#并执行将源文件编译成目标文件的命令。${OBJECTS} : ${SOURCES} $(CC) -c $(CFLAGS) $(INCLUDES) ${SOURCES}#规则clean,它不依赖于别的规则,#执行强行清空目标文件和core dump文件的命令。clean :