【问题标题】:Undefined reference to strcmp with toolchain使用工具链未定义对 strcmp 的引用
【发布时间】:2013-11-10 18:15:39
【问题描述】:

我正在尝试在树莓派上编写一个简单的裸机程序,但是当我尝试使用 strcmp 时出现以下错误:

arm-none-eabi-ld -o main.elf  -T ./src/memmap vectors.o led.o main.o uart.o general.o
main.o: In function `main':
main.c:(.text.startup+0x80): undefined reference to `strcmp'

这是我的制作文件:

ARMGNU = arm-none-eabi


ARMGNU ?= arm-none-eabi

AOPS = --warn --fatal-warnings -mcpu=arm1176jzf-s -march=armv6
COPS = -Wall -O2 -nostdlib -nostartfiles -ffreestanding -mcpu=arm1176jzf-s -mtune=arm1176jzf-s -mhard-float 

LIBRARIES= -I ./include -I ./src 

all : kernel.img 
    rm -f *.bin
    rm -f *.o
    rm -f *.elf
    rm -f *.list
    rm -f *.hex

vectors.o : ./src/vectors.s
    $(ARMGNU)-as $(AOPS) $(LIBRARIES) -mfpu=vfp ./src/vectors.s -o vectors.o

main.o : ./src/main.c
    $(ARMGNU)-gcc $(COPS) $(LIBRARIES) -c ./src/main.c -o main.o

led.o : ./src/led.c
    $(ARMGNU)-gcc $(COPS) $(LIBRARIES) -c ./src/led.c -o led.o

uart.o : ./src/uart.c
    $(ARMGNU)-gcc $(COPS) $(LIBRARIES) -c ./src/uart.c -o uart.o

general.o : ./src/general.c
    $(ARMGNU)-gcc $(COPS) $(LIBRARIES) -c ./src/general.c -o general.o

kernel.img : ./src/memmap vectors.o main.o led.o uart.o general.o
    $(ARMGNU)-ld -o main.elf  -T ./src/memmap vectors.o led.o main.o uart.o general.o
    $(ARMGNU)-objdump -D main.elf > main.list
    $(ARMGNU)-objcopy main.elf kernel.img -O binary


clean:
    rm -r *.img

【问题讨论】:

  • 有可以链接的 libc 吗?否则,编写自己的 strcmp。
  • -nostdlib 似乎很清楚。你需要自己写strcmp,然后(幸运的是这不是火箭科学)。
  • @Jongware 我删除了-nostdlib,同样的错误,@Charlie Burns 我在工具链中找到了 libc.a,我该如何链接它?我也试过COPS = -Wall -O2 -lc -ffreestanding -mcpu=arm1176jzf-s -mtune=arm1176jzf-s -mhard-float

标签: c toolchain bare-metal


【解决方案1】:

这是一个简单的递归 strcmp(你的编译器应该优化掉递归)

int strcmp(const char *a,const char *b){
  if (! (*a | *b)) return 0;
  return (*a!=*b) ? *a-*b : strcmp(++a,++b);
}

【讨论】:

  • 这是一个不错的解决方案,但是例如如果我想动态分配内存,那么仍然会遇到同样的问题。
  • @run 我不确定你的意思。参数不需要额外的内存,它需要指向现有分配的 char 数组的指针。任何分配都在调用 strcmp 之前完成,否则您将没有要比较的字符串。
  • 这里我不需要动态内存分配,但如果需要的话我会遇到和现在一样的问题。
  • @run - 如果你也需要 malloc()/free() 那么你可以考虑使用 musl libc 否则你可以从 K&R 中调整一个小版本的 malloc ,它基本上是内存池并使用 brk()/sbrk() 系统调用添加/删除程序内存
猜你喜欢
  • 1970-01-01
  • 2022-01-14
  • 2014-08-20
  • 1970-01-01
  • 2013-05-03
  • 1970-01-01
  • 2011-08-07
  • 2015-09-09
  • 1970-01-01
相关资源
最近更新 更多