链接C和汇编代码时有多个定义错误?

时间:2016-02-10 00:38:59

标签: c assembly makefile

我最近决定开始使用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 $@

1 个答案:

答案 0 :(得分:2)

看起来这不是make问题,而是你的gcc命令不起作用。你在bash脚本中成功使用了什么命令?

制作隐含规则,以便从.o制作.c,并从.o制作.s。您可以通过自定义某些变量来自定义所发生的事情。

另外,使用.phony: link,如果有一个名为link的文件,它仍会发生。赋予它$(OBJECTS)的依赖性,以便它适当地完成。或者告诉make将要构建的目标的真实姓名。

bin/kernel.bin: $(OBJECTS)
    some_command -o $@  ...