我最近决定开始使用makefile而不是将每个命令键入bash文件,但是在尝试编译时遇到了一个问题。
我正在尝试编译一些C和汇编文件,但不断收到此错误。我已经对所有文件进行了三重检查,并且它们没有任何问题,所以我假设它是我的makefile。
这是我得到的错误:
…
i686-elf-gcc -T linker.ld -o bin/kernel.bin -ffreestanding -O2 -nostdlib src/boot.o \
src/gdt.o src/cgdt.o src/kernel.o -lgcc
src/cgdt.o: In function `gdt_set_gate':
cgdt.c:(.text+0x0): multiple definition of `gdt_set_gate'
src/gdt.o:gdt.c:(.text+0x0): first defined here
src/cgdt.o: In function `gdt_install':
cgdt.c:(.text+0x70): multiple definition of `gdt_install'
src/gdt.o:gdt.c:(.text+0x70): first defined here
src/gdt.o: In function `gdt_install':
gdt.c:(.text+0x17a): undefined reference to `gdt_flush'
src/cgdt.o: In function `gdt_install':
cgdt.c:(.text+0x17a): undefined reference to `gdt_flush'
collect2: error: ld returned 1 exit status
Makefile:17: recipe for target 'link' failed
make: *** [link] Error 1
这是makefile:
CC=i686-elf-gcc
AS=i686-elf-as
LINKER=i686-elf-gcc
CFLAGS=-std=gnu99 -ffreestanding -O2 -Wall -Wextra -I./src/include
LDFLAGS=-T linker.ld
C_SOURCES = $(shell ls src/*.c)
ASM_SOURCES = $(shell ls src/*.s)
OBJECTS = $(ASM_SOURCES:.s=.o) $(C_SOURCES:.c=.o)
all: $(OBJECTS) link
clean:
-rm ./src/*.o
link:
$(LINKER) $(LDFLAGS) -o bin/kernel.bin -ffreestanding -O2 -nostdlib $(OBJECTS) -lgcc
.c.o:
$(CC) $(CFLAGS) -c $< -o $@
.s.o:
$(AS) $< -o $@
答案 0 :(得分:2)
看起来这不是make
问题,而是你的gcc命令不起作用。你在bash脚本中成功使用了什么命令?
制作隐含规则,以便从.o
制作.c
,并从.o
制作.s
。您可以通过自定义某些变量来自定义所发生的事情。
另外,使用.phony: link
,如果有一个名为link
的文件,它仍会发生。赋予它$(OBJECTS)
的依赖性,以便它适当地完成。或者告诉make
将要构建的目标的真实姓名。
bin/kernel.bin: $(OBJECTS)
some_command -o $@ ...