微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Linux下C编程基础之:make工程管理器

Linux下C编程基础之:make工程管理器

时间:08-13 来源:3721RD 点击:

选项,无默认值

FFLAGS

Fortran编译器的选项,无默认值

可以看出,上例中的CC和CFLAGS是预定义变量,其中由于CC没有采用默认值,因此,需要把"CC=gcc"明确列出来。

由于常见的gcc编译语句中通常包含了目标文件和依赖文件,而这些文件在makefile文件中目标体所在行已经有所体现,因此,为了进一步简化makefile的编写,就引入了自动变量。自动变量通常可以代表编译语句中出现目标文件和依赖文件等,并且具有本地含义(即下一语句中出现的相同变量代表的是下一语句的目标文件和依赖文件)。表3.16列出了makefile中常见的自动变量。

表3.16 makefile中常见的自动变量

自 动 变 量

含 义

$*

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

$+

所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件

$<

第一个依赖文件的名称

$?

所有时间戳比目标文件晚的依赖文件,并以空格分开

$@

目标文件的完整名称

$^

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

$%

如果目标是归档成员,则该变量表示目标的归档成员名称

自动变量的书写比较难记,但是在熟练了之后使用会非常方便,请读者结合下例中的自动变量改写的makefile进行记忆。

OBJS = kang.o yul.o

CC = gcc

CFLAGS = -Wall -O -g

david : $(OBJS)

$(CC) $^ -o $@

kang.o : kang.c kang.h

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

yul.o : yul.c yul.h

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

另外,在makefile中还可以使用环境变量。使用环境变量的方法相对比较简单,make在启动时会自动读取系统当前已经定义了的环境变量,并且会创建与之具有相同名称和数值的变量。但是,如果用户在makefile中定义了相同名称的变量,那么用户自定义变量将会覆盖同名的环境变量。

3.5.3 makefile规则

makefile的规则是make进行处理的依据,它包括了目标体、依赖文件及其之间的命令语句。在上面的例子中,都显式地指出了makefile中的规则关系,如"$(CC) $(CFLAGS) -c $< -o $@",但为了简化makefile的编写,make还定义了隐式规则和模式规则,下面就分别对其进行讲解。

1.隐式规则

隐含规则能够告诉make怎样使用传统的规则完成任务,这样,当用户使用它们时就不必详细指定编译的具体细节,而只需把目标文件列出即可。make会自动搜索隐式规则目录来确定如何生成目标文件。如上例就可以写成:

OBJS = kang.o yul.o

CC = gcc

CFLAGS = -Wall -O -g

david : $(OBJS)

$(CC) $^ -o $@

为什么可以省略后两句呢?因为make的隐式规则指出:所有".o"文件都可自动由".c"文件使用命令"$(CC) $(CPPFLAGS) $(CFLAGS) -c file.c –o file.o"来生成。这样"kang.o"和"yul.o"就会分别通过调用"$(CC) $(CFLAGS) -c kang.c -o kang.o"和"$(CC) $(CFLAGS) -c yul.c -o yul.o"来生成。

注意

在隐式规则只能查找到相同文件名的不同后缀名文件,如"kang.o"文件必须由"kang.c"文件生成。

表3.17给出了常见的隐式规则目录。

表3.17 makefile中常见隐式规则目录

对应语言后缀名

隐式规则

C编译:.c变为.o

$(CC) –c $(CPPFLAGS) $(CFLAGS)

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

$(CXX) -c $(CPPFLAGS) $(CXXFLAGS)

Pascal编译:.p变为.o

$(PC) -c $(PFLAGS)

Fortran编译:.r变为-o

$(FC) -c $(FFLAGS)

2.模式规则

模式规则是用来定义相同处理规则的多个文件的。它不同于隐式规则,隐式规则仅仅能够用make默认的变量来进行操作,而模式规则还能引入用户自定义变量,为多个文件建立相同的规则,从而简化makefile的编写。

模式规则的格式类似于普通规则,这个规则中的相关文件前必须用"%"标明。使用模式规则修改后的makefile的编写如下:

OBJS = kang.o yul.o

CC = gcc

CFLAGS = -Wall -O -g

david : $(OBJS)

$(CC) $^ -o $@

%.o : %.c

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

3.5.4 make管理器的使用

使用make管

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top