2013-11-10 3 views
0

Я пытаюсь написать простую программу голого металла на Raspberry Pi, но когда я пытаюсь использовать, чтобы использовать strcmp я получаю следующее сообщение об ошибке:Неопределенная ссылки на 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 
+0

Есть ли libc, с которым можно связаться? В противном случае напишите свой собственный strcmp. –

+0

'-nostdlib' кажется довольно четким. Вам нужно написать свой собственный 'strcmp', тогда (к счастью, это не ракетостроение). – usr2564301

+0

@Jongware Я удалил '-nostdlib', ту же ошибку, @Charlie Burns. Я нашел libc.a в toolchain, как я могу связать его? Я попробовал также «COPS = -Wall -O2 -lc -ffreestanding -mcpu = arm1176jzf-s -mtune = arm1176jzf-s -mhard-float' –

ответ

1

Вот простой рекурсивный зЬгстр (ваш компилятор должен оптимизировать на рекурсию хотя)

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

Это приятное решение, но, например, если бы я хотел динамически распределять память, чем все еще имеют ту же проблему. –

+0

@run Я не уверен, что вы имеете в виду. Параметры не нуждаются в дополнительной памяти, они берут указатели на существующие выделенные массивы символов. Любое выделение выполняется до вызова strcmp, иначе у вас не было бы строк для сравнения. – technosaurus

+0

Здесь мне не требуется динамическое распределение памяти, но в случае, если мне это нужно, я столкнусь с той же проблемой, что и сейчас. –