使用 .PHONY, 使用方法见下面描述或参考链接. 经过测试可行.。
---------
phony 目标可以有依赖关系。当一个目录中有多个程序,将其放在一个makefile 中会更方便。因为缺省目标是makefile 中的第一个目标,通常将这个phony 目标叫做"all",其依赖文件为各个程序:
all : prog1 prog2 prog3。
.PHONY : all
prog1 : prog1.o utils.o。
cc -o prog1 prog1.o utils.o。
prog2 : prog2.o。
cc -o prog2 prog2.o。
prog3 : prog3.o sort.o utils.o。
cc -o prog3 prog3.o sort.o utils.o。
这样,使用"make"将可以将三个程序都生成了。d。
当一个phony 目标是另一个的依赖,其作用相当于子程序,例如:
.PHONY: cleanall cleanobj cleandiff。
cleanall : cleanobj cleandiff。
rm program。
cleanobj :
rm *.o。
cleandiff :
rm *.diff。
----------
我测试的Makefile:
OBJS=main.o sub.o。
all : test sam
.PHONY:all
test : $(OBJS)
gcc -o test $(OBJS)。
sam : sam.o
gcc -o sam sam.o。
main.o : main.c sub.h。
gcc -c main.c
sub.o : sub.c sub.h。
gcc -c sub.c
sam.o : sam.c
gcc -c sam.c
要编译出在 iar开发板上运行的可执行文件,需要使用到交叉编译器 iar-linux-gnueabihf-gcc 来编译,在终端中输入如下命令:
iar-linux-gnueabihf-gcc -g -c led.s -o led.o。
上述命令就是将 led.s 编译为 led.o,其中“-g”选项是产生调试信息,GDB 能够使用这些。
调试信息进行代码调试。“-c”选项是编译源文件,但是不链接。“-o”选项是指定编译产生的文。
件名字,这里我们指定 led.s 编译完成以后的文件名字为 led.o。执行上述命令以后就会编译生。
成一个 led.o 文件
2 、arm-linux-gnueabihf-ld 链接文件。
arm-linux-gnueabihf-ld 用来将众多的.o 文件链接到一个指定的链接位置。我们在学习SMT32 的时候基本就没有听过“链接”这个词,我们一般用 MDK 编写好代码,然后点击“编。
译”,MDK 或者 IAR 就会自动帮我们编译好整个工程,最后再点击“下载”就可以将代码下载。
到开发板中。这是因为链接这个操作 MDK 或者 IAR 已经帮你做好了,因此我们现在需要做的就是确定一下本试验最终的可执行文件其运行起始地址,也就是链接地址。这里我们要区分“存储地址”和“运行地址”这两个概念,“存储地址”就是可执行文件存储在哪里,可执行文件的存储地址可以随意选择。“运行地址”就是代码运行的时候所处的地址,这个我们在链接的时候就已经确定好了,代码要运行,那就必须处于运行地址处,否则代码肯定运行出错。比如设备支持 SD 卡、EMMC、NAND 启动,因此代码可以存储到 SD 卡、EMMC 或者 NAND 中,但是要运行的话就必须将代码从 SD 卡、EMMC 或者NAND 中拷贝到其运行地址(链接地址)处,“存储地址”和“运行地址”可以一样,比如STM32 的存储起始地址和运行起始地址都是 0X08000000,输入如下命令。
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf。
上述命令中-Ttext 就是指定链接地址,“-o”选项指定链接生成的 elf 文件名,这里我们命名。
为 led.elf
如果引用的是系统library里的头文件可以直接 gcc source.c -o source 编译。
如果是你自己的头文件 可以用如下格式:。
<code>
# makefile test for multi files program。
CC=gcc
CFLAGS=
#你要生成的文件: hello1 hello2。
OBJS=hello1.o hello2.o。
all: hello
hello: $(OBJS)
$(CC) $(CFLAGS) $^ -o $@。
#文件包含的头文件与.c文件
hello1.o: hello1.c hello1.h。
$(CC) $(CFLAGS) –c $< -o $@。
hello2.o: hello2.c。
$(CC) $(CFLAGS) –c $< -o $@。
clean:
rm –rf hello *.o。
</code>
希望对你有帮助
以下是一个最简单的多文件+makefile的形式。
编译采用gcc 你可以修改成你的编译器。
三个文件 main.c func.c makefile。
main.c
#include <stdio.h>。
extern void func();//这个应该放在头文件中的 比如func.h 简单起见 就直接声明了。
int main()
func();
func.c
#include <stdio.h>。
void func()
printf("hello world\n");。
makefile
.PHONY: all main.o func.o。
all: main.o func.o。
@gcc main.o func.o -o out。
main.o: main.c
@gcc -c main.c -o main.o。
func.o: func.c
@gcc -c func.c -o func.o。
所有的都是最简单的
一般来说,如果存在多级目录,那么再用makefile的时候,最好在每个目录下也写一个简单的子makefile,这样在总目录下写一个总的makefile,然后再总的makefile中调用子makefile,这样写起来就会比较清晰,编译顺序是要看你的总makefile中的步骤。
另外,如果你写好之后,你也可以make -n一下,这样也就可以看出make的编译顺序了!
也是刚开始学习makefile,共勉!
原文地址:http://www.qianchusai.com/makefile%E7%BC%96%E8%AF%91%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6.html