[英]Makefile variables not working as expected
我正在尝试使用此 makefile 编译程序:
GCCPARAMS = -m32 -fno-use-cxa-atexit -nostdlib -fno-builtin -fno-rtti -fno-exceptions -fno-leading-underscore
ASPARAMS = --32
objects = src/loader.o src/kernel.o
%.o: src/%.cpp
gcc $(GCCPARAMS) -c -o $@ $<
%.o: src/%.s
echo $(ASPARAMS)
as $(ASPARAMS) -o $@ $<
kernel.bin: linker.ld $(objects)
ld $(LDPARAMS) -T $< -o $@ $(objects)
install: kernel.bin
sudo cp $< boot/mykernel.bin
执行make
时会出现问题,它会打印以下内容:
as -o src/loader.o src/loader.s
src/loader.s: Assembler messages:
src/loader.s: Warning: end of file not at end of a line; newline inserted
src/loader.s:18: Error: operand type mismatch for `push'
src/loader.s:19: Error: operand type mismatch for `push'
make: *** [<builtin>: src/loader.o] Error 1
如您所见,该变量未正确设置,相反, make
在变量应有的位置放置一个空格。 这会导致汇编编译器认为它是 64 位架构并给出一些错误。
知道发生了什么吗? 顺便说一句,我正在使用 WSL2 执行此操作。
你看到这个的原因是你的食谱规则是错误的。
你有这些 object 文件:
objects = src/loader.o src/kernel.o
你有这个规则:
%.o: src/%.s
echo $(ASPARAMS)
as $(ASPARAMS) -o $@ $<
在尝试构建src/loader.o
时,模式%.o
的主干匹配什么? 它当然会匹配src/loader
。 那么前提条件是什么呢? 它将是src/%.s
扩展了词干,所以它将是src/src/loader.s
。 我认为这不存在。
因此,此模式规则不匹配。 那么 make 做什么呢? 它寻找不同的模式规则,事实证明 GNU make 提供了一个默认模式规则来构建一个.s
文件,该文件使用模式%.o: %.s
并且该模式确实匹配,所以使用了。
但是该内置规则使用标准 make 变量,即AS
和ASFLAGS
。 您尚未设置ASFLAGS
,因此不使用任何标志。
您可以说它没有使用您的规则,因为您的规则中有一个echo...
并且 make 不会打印该命令。 因此,它不符合您的规则。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.