尽管已安装gcc并正常运行,但如何解决make文件中未找到gcc的错误?

-1 c linux assembly gcc gnu-make

我正在尝试使用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

Run Code Online (Sandbox Code Playgroud)

汇编文件:


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:

Run Code Online (Sandbox Code Playgroud)

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

Run Code Online (Sandbox Code Playgroud)

连结档案:

SECTIONS 
{ 
    . = 0x100000; 
    .text : { *(.text) } 
    .bss  : { *(.bss)  } 
}

Run Code Online (Sandbox Code Playgroud)

这是当前引发的错误:

make: ?: Command not found
make: *** [Makefile:14: bookOs] Error 127
Run Code Online (Sandbox Code Playgroud)

我希望该make文件生成链接c文件和汇编文件的输出。先感谢您!

the*_*bee 5

以开头的命令$(shell没有达到您的期望。请阅读make的文档:

[...]它以一个shell命令作为参数,并评估该命令的输出。

之后的所有shell内容都作为shell命令运行,然后,该命令的输出将被解释make为就好像它在Makefile中一样。在您的情况下,这将是一个命令。文档中的一个示例:

文件:= $(shell echo * .c)

因此解决方案是删除$(shell和右括号。

提示:要查看make不实际执行操作会发生什么,请使用option调用它-n