[英]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.