我正在尝试使用GCC和GNU Make编译并链接程序集和c程序,但是当我运行“ make”命令时,即使安装并运行正常,它也会引发错误“找不到GCC” ,在修复了make文件后,现在在第14行中抛出了找不到make命令!
我已经尝试在另一台机器上编译它,但是没有用。当然,我已经尝试运行常规的GCC命令,并且运行良好!使用环境变量似乎一切正常。如果我尝试在没有make的情况下运行命令,则会引发linker.ld语法错误,但是我假设它在我身上。
制作文件:
CC=gcc TARGET=bookOs C_FILES=./kernel.c OBJS=$(C_FILES:.c=.o) all compile: $(TARGET) all: finale .PHONY: all compile clean finale %.o: gcc -c $(@:.o=.c) -ffreestanding -fno-exceptions -m32 $(TARGET): $(OBJS) ?$(shell nasm -f elf start.asm -o start.o) ?gcc -m32 -nostdlib -nodefaultlibs -lgcc start.o $? -T linker.ld -o $(TARGET) finale: ?$(shell cd ~/Desktop/bookOs/) ? $(shell cp $(TARGET) ./iso/boot/$(TARGET)) $(shell grub2-mkrescue iso --output=$(TARGET).iso) clean: ?rm -f *.o $(TARGET) $(TARGET).iso ?find . -name \*.o | xargs --no-run-if-empty rm
汇编文件:
bits 32 global _start extern kernel_early extern main section .text align 4 dd 0x1BADB002 ;magic dd 0x00 dd - (0x1BADB002 + 0x00) ;checksum _start: cli mov esp, stack call kernel_early call main hlt section .bss resb 8192 stack:
C文件:
CC=gcc TARGET=bookOs C_FILES=./kernel.c OBJS=$(C_FILES:.c=.o) all compile: $(TARGET) all: finale .PHONY: all compile clean finale %.o: gcc -c $(@:.o=.c) -ffreestanding -fno-exceptions -m32 $(TARGET): $(OBJS) ?$(shell nasm -f elf start.asm -o start.o) ?gcc -m32 -nostdlib -nodefaultlibs -lgcc start.o $? -T linker.ld -o $(TARGET) finale: ?$(shell cd ~/Desktop/bookOs/) ? $(shell cp $(TARGET) ./iso/boot/$(TARGET)) $(shell grub2-mkrescue iso --output=$(TARGET).iso) clean: ?rm -f *.o $(TARGET) $(TARGET).iso ?find . -name \*.o | xargs --no-run-if-empty rm
连结档案:
SECTIONS { . = 0x100000; .text : { *(.text) } .bss : { *(.bss) } }
这是当前引发的错误:
make: ?: Command not found make: *** [Makefile:14: bookOs] Error 127
我希望该make文件生成链接c文件和汇编文件的输出。先感谢您!
以开头的命令$(shell
没有达到您的期望。请阅读make
的文档:
[...]它以一个shell命令作为参数,并评估该命令的输出。
之后的所有shell
内容都作为shell命令运行,然后,该命令的输出将被解释make
为就好像它在Makefile中一样。在您的情况下,这将是一个命令。文档中的一个示例:
文件:= $(shell echo * .c)
因此解决方案是删除$(shell
和右括号。
提示:要查看make
不实际执行操作会发生什么,请使用option调用它-n
。