繁体   English   中英

Makefile 变量未按预期工作

[英]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 变量,即ASASFLAGS 您尚未设置ASFLAGS ,因此不使用任何标志。

您可以说它没有使用您的规则,因为您的规则中有一个echo...并且 make 不会打印该命令。 因此,它不符合您的规则。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM