2016-11-01 7 views
0

Я работаю над планировщиком для пользовательской ОС, которую мы используем в классе, но когда я пытаюсь вызвать функцию rand(), это дает мне это ошибка:Неопределенная ссылка на rand() даже считалась включенной и определенной

In function `gen_rand_number': 
sched.c:(.text+0x5e): undefined reference to `rand' 

Вот мой sched.c файл

#include <stdlib.h> 
#include <signal.h> 

PUBLIC int gen_rand_number(int min, int max) { 
    int r; 
    const int range = 1 + max - min; 
    const int buckets = RAND_MAX/range; 
    const int limit = buckets * range; 

    do { 
     r = rand(); 
    } while (r >= limit); 

    return min + (r/buckets); 
} 

Так после того, как много Googling, я понял, может быть, STDLIB не была реализована на этой ОС, однако я проверил и

он определен на: включить/stdlib.h

и реализован на: ЦСИ/Библиотека/Libc/STDLIB/rand.c следующим образом:

int rand(void) 
{ 
    _next = (_next * 1103515245) + 12345; 
    return ((_next >> 16) & 0x7fff); 
} 

Я понимаю, что это довольно специфическая проблема, но я надеюсь, что кто-то сможет мне помочь. Кроме того, если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

If you want to look at the whole OS code

Поскольку это подходит, я использую Makefile:

экспорт EDUCATIONAL_KERNEL = 1

# Directories. 
export BINDIR = $(CURDIR)/bin 
export SBINDIR = $(BINDIR)/sbin 
export UBINDIR = $(BINDIR)/ubin 
export DOCDIR = $(CURDIR)/doc 
export INCDIR = $(CURDIR)/include 
export LIBDIR = $(CURDIR)/lib 
export DOXYDIR = $(CURDIR)/doxygen 
export SRCDIR = $(CURDIR)/src 
export TOOLSDIR = $(CURDIR)/tools 

# Toolchain 
export CC = $(TARGET)-gcc 
export LD = $(TARGET)-ld 
export AR = $(TARGET)-ar 

# Random number for chaos. 
export KEY = 13 

# Toolchain configuration. 
export CFLAGS = -I $(INCDIR) 
export CFLAGS += -DKERNEL_HASH=$(KEY) -DEDUCATIONAL_KERNEL=$(EDUCATIONAL_KERNEL) 
export CFLAGS += -std=c99 -pedantic-errors -fextended-identifiers 
export CFLAGS += -nostdlib -nostdinc -fno-builtin -fno-stack-protector 
export CFLAGS += -Wall -Wextra -Werror 
export CFLAGS += -Wstack-usage=3192 -Wlogical-op 
export CFLAGS += -Wredundant-decls -Wvla 
export ASMFLAGS = -Wa,--divide,--warn 
export ARFLAGS = -vq 
export LDFLAGS = -Wl,-T $(LIBDIR)/link.ld 

# Resolves conflicts. 
.PHONY: tools 

# Builds everything. 
all: nanvix documentation 

# Builds Nanvix. 
nanvix: 
    mkdir -p $(BINDIR) 
    mkdir -p $(SBINDIR) 
    mkdir -p $(UBINDIR) 
    cd $(SRCDIR) && $(MAKE) all 

# Builds system's image. 
image: $(BINDIR)/kernel tools 
    mkdir -p $(BINDIR) 
    bash $(TOOLSDIR)/build/build-img.sh $(EDUCATIONAL_KERNEL) 

# Builds documentation. 
documentation: 
    doxygen $(DOXYDIR)/kernel.config 

# Builds tools. 
tools: 
    mkdir -p $(BINDIR) 
    cd $(TOOLSDIR) && $(MAKE) all 

# Cleans compilation files. 
clean: 
    @rm -f *.img 
    @rm -rf $(BINDIR) 
    @rm -rf $(DOCDIR)/*-kernel 
    cd $(SRCDIR) && $(MAKE) clean 
    cd $(TOOLSDIR) && $(MAKE) clean 
+1

Какую команду вы использовали, когда получили это сообщение об ошибке? –

+0

отправил makefile @DavidSchwartz – leofontes

+1

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

ответ

4

Поскольку вы создаете автономную ОС, а не приложение, у вас нет доступа к стандартной библиотеке. Если вы посмотрите в make-файле, вы увидите, что он передает -nostdlib -nostdinc компилятору и компоновщику. Если ваша кодовая база предоставляет PRNG, вы можете ее использовать. В противном случае вам нужно будет добавить реализацию.

+0

Прежде всего спасибо за ответ. Я получаю то, что вы говорите, но если они реализуют stdlib здесь https://github.com/ppenna/nanvix/tree/master/src/lib/libc/stdlib, не должен ли я использовать его? Когда я отправлялся в googled around, прежде чем публиковать это, я пришел к такому же выводу, как и вы, но я подумал, что если бы они реализовали его, я мог бы использовать его. Правильно? – leofontes

+0

@leofontes Вы должны, но при быстром осмотре, кажется, сломаны. Посмотрите в 'rand.h', и вы увидите, что есть определение' rand', но нет. Не совсем понятно, что вы делаете - пытаетесь ли вы сами создать ОС или пытаетесь создать для нее приложение? Если первый, вы уверены, что ОС разрешено использовать библиотеку? Если последний, почему вы набираете 'make nanvix'? –

+0

Это дополнительное назначение бонусов, я уже реализовал предложенные динамические приоритеты, но теперь я пытаюсь создать планировщик лотереи для процессов на этой ОС. Я не прошу о помощи в задании, просто хочу понять, что происходит. Я попытался объявить функцию rand в файле .h, но он все еще не работает, я попытаюсь исправить библиотеку. Спасибо за помощь Дэвида. :) – leofontes

1

Вы должны связать в собственной реализации библиотеки С несколько например:

$ gcc -LPATH -lc $object_files -o executable 

где PATH является относительным путь к вашему собственному libc

Или ... возможно, вам лучше послушать Дэвида Шварца, который уже указывал, что вы должны сами реализовать rand. Здесь это означает: вам нужно реализовать его в ядре, потому что я предполагаю, что sched.c - это файл, принадлежащий вашему ядру, и поэтому функции stdclib недоступны для вас.

+0

Я использую make-файл, как я могу добавить это? Извините, я все еще учился C – leofontes

+0

забыл свой ответ. –

+0

Проверьте, что я прокомментировал на ответ Дэвида, пожалуйста, @BodoThiesen – leofontes