Я работаю над планировщиком для пользовательской ОС, которую мы используем в классе, но когда я пытаюсь вызвать функцию 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
Какую команду вы использовали, когда получили это сообщение об ошибке? –
отправил makefile @DavidSchwartz – leofontes
, вы должны добавить большой жирный красный мигающий предупреждающий индикатор в верхней части сообщения, что вы не работаете в обычной среде C, а вместо этого во встроенной среде. –