理解Makefile:一个C语言编译的例子

需积分: 4 1 下载量 133 浏览量 更新于2024-09-17 收藏 3KB TXT 举报
该资源是一个关于`makefile`的实例解释,主要展示了如何编写和使用`makefile`来编译和链接一个简单的ARM架构的C程序。`makefile`包含了编译规则、编译选项以及目标文件的生成过程。 在`makefile`中,我们首先看到了变量`CFLAGS`被定义,用于存储编译时的标志。这些标志包括: 1. `-Wall`: 开启所有警告,这对于早期检测潜在问题非常有用。 2. `-Wstrict-prototypes`: 确保所有的函数原型都正确,避免类型不匹配的问题。 3. `-O2`: 优化级别为2,这是常用的优化级别,能够提高代码的运行速度。 4. `-fomit-frame-pointer`: 为了节省空间和提高性能,不创建帧指针,但这可能会影响调试。 5. `-ffreestanding`: 指示编译器生成的代码不依赖于标准库,适用于嵌入式环境。 6. `-fno-builtin`: 关闭内联函数,如`exit`、`abs`等,防止编译器使用内置实现,有时这在嵌入式系统中是必要的。 接着,`makefile`定义了目标`leds.bin`及其依赖关系。`leds.bin`由`crt0.S`和`leds.c`两个源文件生成,编译步骤如下: 1. 使用`arm-linux-gcc`和`CFLAGS`中的选项分别编译`crt0.S`和`leds.c`为`.o`对象文件。 2. 使用`arm-linux-ld`链接`.o`文件生成`leds_elf`可执行文件,其中`-Ttext0x00000000`指定程序的加载地址。 3. 使用`arm-linux-objcopy`将`leds_elf`转换为二进制文件`leds.bin`。 4. 使用`arm-linux-objdump`反汇编`leds_elf`以生成`leds.dis`,方便查看代码。 此外,`makefile`还包含了一个`clean`目标,用于清理编译过程中产生的临时文件。 通过这个`makefile`实例,我们可以学习到如何配置编译选项,处理依赖关系,以及如何生成适合嵌入式系统的二进制文件。同时,了解`makefile`的结构和语法对于管理和自动化构建项目至关重要。