簡體   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