-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文件和汇编文件的输出。先感谢您!
以开头的命令$(shell没有达到您的期望。请阅读make的文档:
[...]它以一个shell命令作为参数,并评估该命令的输出。
之后的所有shell内容都作为shell命令运行,然后,该命令的输出将被解释make为就好像它在Makefile中一样。在您的情况下,这将是一个命令。文档中的一个示例:
文件:= $(shell echo * .c)
因此解决方案是删除$(shell和右括号。
提示:要查看make不实际执行操作会发生什么,请使用option调用它-n。
| 归档时间: |
|
| 查看次数: |
58 次 |
| 最近记录: |