Ubuntu下 make工程管理器的使用
gcc用于编译,gdb用于调试,make用于工程管理。当工程文件数量庞大,多大数百上千的时候,人工去管理这数量众多的文件的编译链接其难度可想而知,而make工程管理器作为“自动编译管理器”,能够根据工程文件的时间戳自动发现更新过的文件减少编译量,通过对makefile文件的读取指导执行大量的编译工作,大大提高了工作效率。
makefile的基本结构
makefile文件是make工具读取的唯一配置文件,在一个makefile文件中通常包含以下部分:
- 需要由make工具创建的目标体(target)
- 要创建的目标体所依赖的依赖文件(dependency_file)
- 创建每个目标体时需要运行的命令(command),该行必须以Tab键开头
target: dependency_file
command
#简单示例
hello.o: hello.c hello.h
gcc -c hello.c -o hello.h
写好了makefile就可以使用make工具进行操作了。make的使用格式为:make target,然后make就会自动读取makefile文件并执行相应target的command语句了。
makfile变量
为了进一步简化编辑和维护makefile,make工具允许在makefile中创建和使用变量。变量是在makefile中定义的名字,用来替代一个文本字符串,该文本字符串称为该变量的值。在具体要求下,这些值可以替代目标体(target)、依赖文件(dependency_file)、命令(command)以及makefile文件中的其他部分。
makefile中变量的定义分为:递归方式、简单方式。
递归方式指的是变量的定义中包含了对其他变量的引用,然后在展开的时候一次性展开。
简单方式指的是简单扩展型变量的值在定义处展开,并且只展开一次,不包含对其他变量的引用。
makfile中常见的预定义变量
AR
库文件维护程序的名称,默认值为ar
AS
汇编程序的名称,默认值为as
CC
C编译器的名称,默认值为cc
CPP
C预编译器的名称,默认值为$(CC)-E
CXX
C++编译器的名称,默认值为g++
FC
Fortran编译器的名称,默认值为f77
RM
文件删除程序的名称,默认值为rm-f
ARFLAGS
库文件维护程序的选项,无默认值
ASFLAGS
汇编程序的选项,无默认值
CFLAGS
C编译器的选项,无默认值
CPPFLAGS
C预编译器的选项,无默认值
CXXFLAGS
C++编译器的选项,无默认值
FFLAGS
Fortran编译器的选项,无默认值
makefile中常见的自动变量
$*
不包含扩展名的目标文件名称
$+
所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件
$<
第一个依赖文件的名称
$?
所有时间戳比目标文件晚的依赖文件,并以空格分开
&@
目标文件的完整名称
$^
所有不重复的依赖文件,以空格分开
$%
如果目标文件是归档成员,则该变量表示目标的归档成员名称
值得注意的还有一点,在makefile中可以使用系统环境变量,但如果用户在makefile中定义了相同的变量,那么用户定义的变量就会覆盖原有的系统变量。
makefile规则
- 隐含规则
隐含规则能够告诉make如何使用传统的规则完成任务,这样用户就在使用时 不必指定详细的编译细节。
在隐式规则中只能查找到相同文件名的不同后缀名文件,如:“test.o”文件必须 由”test.c”文件生成。
makefile中常见的隐式规则
C编译
$(CC) -c $(CPPFLAGS) $(CFLAGS)
C++编译
$(CXX) -c $(CPPFLAGS) $(CXXFLAGS)
Pascal编译
$(PC) -c $(PFLAGS)
Fortran编译
$(FC) -c $(FFLAGS)
- 模式规则
模式规则是用来定义相同处理规则的多个文件,模式规则能引入用户自定义变 量,为多个文件建立相同的规则,简化makefile的编写。
make的命令行选项
-C dir
读入指定目录下的makefile
-f file
读入当前目录下的file文件作为makefile
-i
忽略所有的命令执行错误
-I dir
指定被包含的makefile所在目录
-n
只打印要执行的命令,但不执行这些命令
-p
显示make变量数据库和隐含规则
-s
在执行命令时不显示命令
-w
如果make在执行过程中改变目录,则打印当前目录名