交叉编译基础知识总结(2)

  • Post author:
  • Post category:其他


工程管理器-make

make是一个自动编译管理器,能够根据文件

时间戳

自动发现更新过的文件从而减少编译的工作量,同时,它通过读入Makefile文件的内容来执行大量的编译工作,用户只需要编写一次简单的编译语句即可。

1. Makefile基本结构

Makefile用来告诉make如何编译和链接一个程序,它是make读入的唯一配置文件。

Makefile中最重要的元素-规则。

规则的语法:

Target:

prerequisites


@commands

Target: 目标文件,可执行文件或是一个标签


Prerequisites


:要创建目标体所依赖的文件,或者是其他目标


Command


:创建每个目标体时需要的运行的命令




Note






1





command


前的


@


是表示不打印出命令


2





command


前必须要有一个“


Tab


”符

2. Makefile中变量

Makefile中的变量使用格式为$(VAR)

1. 变量赋值

1)

递归扩展方式

:在引用该变量时进行替换,即如果该变量包含了对其他变量的引用,则在引用该变量时递归地将内嵌的变量全部展开。形如:


objects = main.o foo.o bar.o utils.o

2)

简单扩展方式

:递归扩展方式定义的变量存在一个严重的缺点,就是不能在变量后面追加内容,因为语句“CFLAGS = $(CFLAGS) -O”在变量扩展中可能导致无限循环。为了避免这种问题发生,引入简单扩展方式;变量赋值,make只对其进行一次扫描和替换。形如:


objects := $(objects) another.o

3)其他赋值方式



条件赋值



:


当变量以前没有定义时,就定义它并且将右边的值赋值给它,如果已经定义了那么就不再改变其值。形如:


CROSS_COMPILE


?= arm-none-linux-gnueabi-



追加赋值



:变量在之前已经赋值,想追加一些内容给它。形如:


objects = main.o foo.o bar.o utils.o




objects += another.o

2. 预定义变量

命令格式

含义

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编译器的选项,无默认值

3. 自动变量

命令格式

含义

$*

不包含扩展名的目标文件名称

$+

所有的依赖文件,可能包含可重复文件

$<

第一个依赖文件的名称

$?

所有时间戳比目标文件晚的依赖文件

$@

目标文件的完整名称

$^

所有不重复的依赖文件,以空格分开

$%

表示目标的归档成员名称


Note:





Makefile


中还有几个特殊变量,我们可能经常需要用到。 第一个就是


MAKE


变量,它表示的是


make


命令名是什么。 当我们需要在


Makefile


中调用另一个


Makefile


时需要用到这个变量, 采用这种方式,有利于写一个容易移植的


Makefile



3. Makefile 规则

1. 隐式规则

隐式规则能告诉make怎样使用传统的技术完成任务,这样,当用户使用它们是不必详细指定编译的具体细节,而把目标文件列出即可。形如:

main.o: main.c defs.h

command.o: command.c defs.h command.h

在上面的Makefile文件中,我们省略了规则的命令“$(CC) $(CFLAGS) -c $< -o $@”

Makefile中常见隐式规则目录

对应语言后缀名

规则

C编译:“.c”变为“.o”

$(CC) -c $(CPPFLAGS) $(CFLGAS)

C++编译:“.cc”或“.C”变为“.o”

$(CXX) -c $(CPPFLAGS) $(CXXFLGAS)

Pascal 编译:“.p”变为“.o”

$(PC) -c $(PFLGAS)

Fortran 编译:“.r”变为“.o”

$(FC) -c $(FFLGAS)

2. 模式规则

模式规则不同于隐式规则,是用来定义处理相同的多个文件的规则,模式规则能引入用户自定义变量,为多个文件建立相同的规则。 形如:

%.s:%.S

#预处理

$(CPP) $(AFLAGS) $(CFLAGS) $< -o $@

%.o:%.S

#预处理+编译+汇编

$(CC) $(AFLAGS) $(CFLAGS) $< -o $@ -c

%.o:%.c

#预处理+编译+汇编

$(CC) $(CFLAGS) $< -o $@ -c

%.i:%.c

#预处理

$(CPP) $(CFLAGS) $< -o $@

%.s:%.c

#编译

$(CC) $(CFLAGS) $< -o $@ -S

%.o:%.s

#编译

$(AS) $(AFLAGS) $(CFLAGS) $< -o $@

4. make使用

make常用的命令行选项

命令格式

含义

-C dir

读入指定目录下的Makefile

-f file

读入当前目录下的file文件作为Makefile

-i

忽略所有的命令执行错误

-I dir

指定被包含的Makefile所在目录

-n

只打印要执行的命令,但不执行这些命令

-p

显示make变量数据和隐式规则

-s

在执行命令时不显示命令

-w

如果执行过程中改变目录,打印当前目录



版权声明:本文为cagent_z原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。