【问题标题】:Makefile variables not working as expectedMakefile 变量未按预期工作
【发布时间】:2021-07-18 02:01:55
【问题描述】:

我正在尝试使用这个 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 进行此操作。

【问题讨论】:

    标签: c++ makefile kernel gnu-make


    【解决方案1】:

    你看到这个的原因是你的食谱规则是错误的。

    你有这些目标文件:

    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 不会打印该命令。因此,它不符合您的规则。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-30
      • 2018-04-24
      • 2017-08-26
      • 1970-01-01
      • 2014-03-28
      • 2019-05-18
      • 1970-01-01
      相关资源
      最近更新 更多