在这个 Makefile 中,以下两行内容的含义是:

  1. $(CC) $(CFLAGS) $^ -o $@ -lm

    • $(CC):这是一个变量,表示编译器,在这个文件中,它被定义为 avr-gcc
    • $(CFLAGS):这是编译选项的变量。在这个文件中,它被定义为 -mmcu=atmega32u2 -Os -Wall,表示编译时的选项。
    • $^:这是一个自动化变量,表示所有的依赖文件。具体来说,它会列出当前目标文件(如 tictactoe.out)所依赖的所有文件。
    • -o $@-o 指定输出文件,$@ 是自动化变量,表示当前目标文件的名称(如 tictactoe.out)。
    • -lm:这个选项告诉编译器在链接阶段加入数学库(libm),这是标准的C语言数学库。

    综合解释:这一行命令使用 avr-gcc 编译依赖的源文件并生成可执行文件(目标文件),并链接数学库。

  2. $(SIZE) $@

    • $(SIZE):这是一个变量,表示要使用的工具,在这个文件中,它被定义为 avr-size,是一个用来显示生成的二进制文件大小的工具。
    • $@:如前所述,这是自动化变量,表示当前目标文件的名称。

    综合解释:这一行命令使用 avr-size 显示生成的可执行文件的大小信息。

因此,这两行的目的是编译项目生成目标可执行文件,并显示生成文件的大小。

Makefile 中,如果要把这部分写完整,可以参考以下的完整写法:

1
2
3
tictactoe.out: tictactoe.o pio.o system.o led.o
avr-gcc -mmcu=atmega32u2 -Os -Wall tictactoe.o pio.o system.o led.o -o tictactoe.out -lm
avr-size tictactoe.out

解释: 1. 目标文件tictactoe.out 是目标文件,表示最终要生成的可执行文件。 2. 依赖文件tictactoe.o pio.o system.o led.o 是目标文件所依赖的 .o 文件。 3. 编译命令: - 第二行指示使用编译器 avr-gcc 以及编译选项 $(CFLAGS),将依赖的 .o 文件链接生成最终的可执行文件 tictactoe.out,并且包含数学库 -lm。 - 第三行会使用 avr-size 工具显示生成的 tictactoe.out 文件的大小信息。

关键点: - $^ 会被替换为所有的依赖文件(在这里是 tictactoe.o pio.o system.o led.o)。 - $@ 会被替换为目标文件(在这里是 tictactoe.out)。