例如:make –f Hello.makefile 3.2嵌套执行make 在一些大的工程中,不同模块或是不同功能的源文件放在不同的目录中,可以在每个目录中都书写一个该目录的Makefile,这有利于Makefile变得更加地简洁,而不至于把所有的东西全部写在一个Makefile中,这个技术对于进行模块编译和分段编译有着非常大的好处。 例如,有一个子目录叫subdir,这个目录下有个Makefile文件指明了这个目录下文件的编译规则。那么总控的Makefile可以书写: subsystem:
cd subdir && $(MAKE) 如果要传递变量到下级Makefile中,那么可以使用export
GNU make 命令还有一些其他选项,下面给出了这些选项。 命令行选项 含义 -C DIR 在读取 makefile 之前改变到指定的目录 DIR。 -f FILE 以指定的 FILE 文件作为 makefile。 -h 显示所有的 make 选项。 -i 忽略所有的命令执行错误。 -I DIR 当包含其他 makefile 文件时,可利用该选项指定搜索目录。 -n 只打印要执行的命令,但不执行这些命令。 -p 显示 make 变量数据库和隐含规则。 -s 在执行命令时不显示命令。 -w 在处理 makefile 之前和之后,显示工作目录。 -W FILE 假定文件 FILE 已经被修改。
【实验仪器】
1、装有Linux操作系统的PC机一台;
2、XSBase270或XSBase255 ARM实验开发平台一套
【实验内容】
一、使用命令行的方式手动编译程序方法 1、利用文本编辑器创建hello.c文件 //hello.c //written by Emdoor #include
6
通过ls命令查看当前目录下是否生成源代码hello.c的object文件hello.o和可执行文件hello,运行可执行文件hello。查看一下运行结果。 [root@local]$./hello
3、修改hello.c文件,重新手动编译应用程序。 4、删除hello.o和hello文件 [root@local]$rm –f hello.o [root@local]$rm –f hello
二、利用 GNU make 自动编译应用程序方法
1、 利用文本编辑器创建一个makefile文件,并将其保存到与hello.c相同的目录下。 # makefile test for hello program #written by Emdoor CC=gcc CFLAGS= all: hello hello: hello.o $(CC) $(CFLAGS) hello.o –o hello hello.o: hello.c $(CC) $(CFLAGS) –c hello.c –o hello.o clean: rm –rf hello *.o 2、先后执行如下命令 [root@local]$make [root@local]$ls [root@local]$./hello
查看并记录所生成的文件和运行的结果。 3、执行make clean命令: [root@local]$make clean
4、修改hello.c文件,重复第2、3步操作,查看并记录所生成的文件和运行结果,并与手动编译进行比较,写出你的结论。
5、重新编辑makefile文件(斜黑体表示修改部分) # makefile test for hello program #written by Emdoor CC=gcc CFLAGS= OBJS=hello.o all: hello hello: $(OBJS) $(CC) $(CFLAGS) $^ -o $@ hello.o: hello.c $(CC) $(CFLAGS) –c $< -o $@ clean: rm –rf hello *.o
7
6、重复第2,3步操作,查看并记录所生成的文件和运行的结果。比较这两种操作,写出你的结论。同时指出$^ 、$@、$<在上述Makefile中的含义。
三、多个.c文件的编译
1、创建文件hello1.c、hello2.c、hello.h和makefile //hello1.c //written by Emdoor #include
8
[root@local]$make [root@local]$ls [root@local]$./hello
查看并记录所生成的文件和运行的结果, 写出你的结论。 3、修改makefile文件(斜黑体表示修改部分) # makefile test for multi files program #written by Emdoor CC=gcc CFLAGS= CFILES=$(wildcard *.c) OBJS=$(CFILES:%c=%.o) all: hello hello: $(OBJS) $(CC) $(CFLAGS) –o hello $(OBJS) .c.o: $(CC) –c $< clean: rm –rf hello *.o 4、重复第2步操作,查看并记录所生成的文件和运行的结果, 写出你的结论。并指出wildcard、.c.o的含义和变量CFILES代表的内容。
【思考题】
1、 根据提供的Linux操作系统源码中得Makefile结构,分析在工程中多级目录中存在着多
个makefile时,编译的顺序如何? 2、 根据Makefile中变量定义规则,如果实验中的hello.c文件编译到目标平台中运行,应该
怎样修改Makefile中变量参数?
9