Makefile 编译生成多个可执行文件的问题排查与实现方案
问题根因分析
- 你最初编写的规则属于make的多目标规则,
$(EXE): $(OBJS)的逻辑是将所有待生成的可执行文件作为一个整体,共用同一组依赖、仅执行一次编译命令,不会为每个可执行文件单独触发规则。 - 自动变量
$<仅指代依赖列表中的第一个文件,因此你只会用第一个.o文件生成第一个可执行文件,无法生成后续的其他可执行文件。 - 将
$@替换为$(EXE)的尝试不符合gcc编译参数逻辑,单条编译命令无法同时生成多个独立的可执行文件,因此无法解决问题。
正确方案原理说明
你最终采用的是make的静态模式规则,完全符合批量生成同类型可执行文件的需求,各部分逻辑如下:
$(EXE): % : %.o是静态模式规则的标准写法:%是匹配占位符,会逐个匹配$(EXE)变量中的每一个可执行文件名,自动将匹配到的部分替换到依赖列表中,实现每个可执行文件单独依赖同名的.o文件。- make会为每个可执行文件单独执行一次下面的编译命令,
$@对应当前正在生成的可执行文件名,$<对应它自己的同名.o文件,就能逐个生成所有目标可执行文件。 - 新增的
all伪目标是为了适配make的默认执行逻辑:make默认会执行Makefile中定义的第一个目标,将all放在最靠前的位置,依赖所有待生成的可执行文件,执行make命令时就会自动生成所有可执行文件。 .PHONY用于标记all和clean是伪目标,避免当前目录下存在同名的all或clean文件时,make误判目标已最新不执行对应规则。
你可以补充clean规则用于清理生成的文件,示例如下:
clean: rm -f $(EXE) $(OBJS)
内容的提问来源于stack exchange,提问作者Apollo
相关产品推荐
相关产品推荐

