Makefile报No rule to make target及NASM编译错误如何解决
错误逐个修复说明
1. 最初No rule to make target 'kernel-entry.asm', needed by 'kernel-entry.o'报错原因
- 该报错和CFLAGS参数无关,核心原因是Makefile执行时,当前工作目录下不存在名为
kernel-entry.asm的文件,可能是文件名拼写错误、大小写不符、文件存放在其他子目录未指定路径,你后续将原.c后缀的文件重命名为.asm解决了这个问题。 - 你之前给NASM传入
$(CFLAGS)是错误操作:-Wall -g是GCC的C语言编译参数,NASM不支持该类参数,所以会触发无效标识报错,移除该参数是正确操作。
2. warning: overriding recipe for target 'abc.bin'警告修复
你的Makefile中重复定义了两次abc.bin的编译规则,Make只会生效最后一次定义的规则,直接删除其中一个重复的abc.bin规则即可消除警告。
3. NASM参数-f elf -o的作用
两个参数都是NASM的合法参数,本次报错和参数无关:
-f elf:指定NASM输出的文件格式为ELF格式的可重定位目标文件(也就是常规的.o文件),该格式的文件可直接交给ld链接器做后续链接操作。-o 文件名:指定NASM输出的文件名称,你当前输出为.bin后缀不符合命名规范,因为-f elf输出的不是纯二进制文件,建议修改为kernel-entry.o更合理。
4. kernel-entry.asm:2: error: invalid directive line报错原因
该报错指向你的汇编文件本身存在语法问题,和NASM参数无关:是kernel-entry.asm文件的第2行书写的汇编指令/伪指令不符合NASM的语法规范,比如误用了GAS汇编器的语法、伪指令拼写错误、符号书写不规范等,自行检查文件第2行内容即可修复。
5. Makefile其他逻辑问题
你当前的kernel.bin规则中依赖kernel-entry.bin,但你生成kernel-entry.bin时用-f elf输出的是ELF格式目标文件,后续交给ld链接是没问题的,但命名容易和-f bin输出的纯二进制文件混淆,建议统一将链接前的可重定位目标文件命名为.o后缀,避免逻辑混乱。
内容的提问来源于stack exchange,提问作者user786
相关产品推荐
相关产品推荐

