Makefile简单实战

来源:互联网 发布:java 释放mysql连接池 编辑:程序博客网 时间:2024/04/29 20:36

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 :

             rm -f ${OBJECTS} core

不难吧,相信再通过一些练习,你一定能写出更好的makefile文件。

你也可以试试自动生成makefile工具,比如autoscan、autoconf、automark等,下面是一篇挺好的文章:
http://vindaci.members.sonic.net/cbreak/projects/autotools/index.php3

原创粉丝点击