gpt4 book ai didi

c - 对 rand() 的 undefined reference 甚至认为它已被包含和定义

转载 作者:太空宇宙 更新时间:2023-11-04 05:51:33 27 4
gpt4 key购买 nike

我正在研究我们在类里面使用的自定义操作系统的调度程序,但是当我尝试调用 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);
}

所以经过大量的谷歌搜索,我意识到也许 stdlib 没有在这个操作系统上实现,但是我检查并

定义在:include/stdlib.h

并实现于:src/lib/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,您会看到它将 -nostdlib -nostdinc 传递给编译器和链接器。如果您的代码库提供了 PRNG,您就可以使用它。否则,您需要添加一个实现。

关于c - 对 rand() 的 undefined reference 甚至认为它已被包含和定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40353201/

27 4 0
文章推荐: CSS 架构、7-1 和样式组件
文章推荐: linux - 通过以编程方式关闭打开的应用程序来强制卸载 USB 驱动器
文章推荐: 玛雅中的 python : get theline with warning
文章推荐: html - 如何使用 css 设置