基本概念
Makefile 是工程管理工具,用于编译多个源文件(可能在不同目录下),可以添加编译选项。
基本语法规则
makefile
目标: 依赖 [TAB] 规则命令
版本演进
版本1:直接编译
makefile
a.out: main.c func.c gcc main.c func.c -o a.out
版本2:使用内置变量
makefile
a.out: main.c func.c gcc $^ -o $@ # 不需要依赖文件 clean: rm a.out
内置变量说明:
$^:在本条规则中,表示所有的依赖文件$@:在本条规则中,表示目标文件
执行示例:
# 第一次编译 linux@ubuntu:~/20251103/os_app/Make$ make # 源文件未被修改时再次编译 linux@ubuntu:~/20251103/os_app/Make$ make make: 'a.out' is up to date. # 清理生成的文件 make clean
说明:当产生目标文件的相关源文件没有被修改(没有被更新)时,Make 不会重新编译。
版本3:使用自定义变量
makefile
# 定义变量 SRC = main.c SRC += func.c # 追加变量 APP = a.out FLAG = -g # 编译选项,如调试信息 $(APP): $(SRC) gcc $^ -o $@ $(FLAG) clean: rm $(APP)
变量说明:
SRC:源文件列表APP:生成的可执行文件名FLAG:编译选项(如-g用于调试)
相关源文件
main.c
#include <stdio.h> #include "func.h" int main() { int a = 10; int b = 20; int c = add(a, b); printf("add is %d\n", c); c = sub(a, b); printf("sub is %d\n", c); }func.c
int add(int a, int b) { return a + b; } int sub(int a, int b) { return a - b; }func.h
#ifndef __FUNC_H_ #define __FUNC_H_ int add(int a, int b); int sub(int a, int b); #endif
注意事项
Makefile 文件名可以是
makefile或Makefile(建议使用后者)命令前的缩进必须是 Tab 键,不能是空格
当执行
make命令后,会在当前目录下查找 Makefile 文件make clean用于清理生成的文件Make 会检查文件的更新时间,如果依赖文件比目标文件新,才会重新编译
完整示例 Makefile
makefile
# 变量定义 SRC = main.c func.c APP = a.out FLAG = -g # 默认目标 $(APP): $(SRC) gcc $^ -o $@ $(FLAG) # 清理规则 clean: rm -f $(APP)
这个 Makefile 实现了:
一键编译所有源文件生成可执行文件
支持调试选项
提供清理功能
自动判断是否需要重新编译