2016-11-01 9 views
0

私はクラスで使用しているカスタムOSのスケジューラに取り組んでいますが、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); 
} 

あるので、グーグルの多くの後、私は多分STDLIBが、このOS上で実装されていなかった実現、しかし、私はチェックして

それは上に定義されます。

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

これが来ているので、私はメイクファイルを使用しています:= 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

はメイクファイル@DavidSchwartz – leofontes

+1

を投稿しました。あなたのポストの上部には、通常のC環境ではなく埋め込み環境で作業している、大きな赤い点滅警告灯を追加する必要があります。 –

答えて

4

アプリケーションではなくフリースタンディングOSを構築しているので、標準ライブラリにアクセスすることはできません。 makefileを見ると、-nostdlib -nostdincがコンパイラとリンカに渡されていることがわかります。あなたのコードベースがPRNGを提供するならば、それを使うことができます。それ以外の場合は、1の実装を追加する必要があります。

+0

最初に答えに感謝します。私はあなたが言っているものを得るが、もし彼らがここでstdlibを実装していれば、https://github.com/ppenna/nanvix/tree/master/src/lib/libc/stdlib私はそれを使うべきではないだろうか?私はこれを投稿する前に私はあなたと同じ結論に達したが、私は彼らがそれを実装することが私はそれを使用することができたと思った。右? – leofontes

+0

@leofontesあなたはすばやく調べると壊れているようです。 'rand.h'を見てみると' rand'の定義がありますが、そこにはありません。あなたが何をしているのかがはっきりしない - あなたはOS自体を構築しようとしているのですか、それともアプリケーションを構築しようとしていますか?前者の場合、OSでライブラリを使用することはできますか?後者の場合、なぜ 'make nanvix 'とタイプしていますか? –

+0

これは余分なボーナスの割り当てです。私はすでに提案された動的優先順位を実装しましたが、今はこのOS上のプロセス用の宝くじスケジューラーを構築しようとしています。私は、割り当てについての助けを求めていない、ちょうど起こっていることを理解したい。私は.hファイルのrand関数を宣言しようとしましたが、それでも動作しません、私はライブラリを修正しようとします..あなたの助けをありがとうDavid。 :) – leofontes

1

輸出EDUCATIONAL_KERNELをあなたは多少Cライブラリの独自の実装にリンクする必要があります

$ gcc -LPATH -lc $object_files -o executable 

ここで、PATHは相対値ですあなた自身のlibcへのパス

またはおそらく、あなたが自分自身でランドを実装しなければならないことをすでに指摘しているDavid Schwartzに聞くべきでしょう。 sched.cはカーネルに属するファイルなので、stdclib関数は利用できません。つまり、カーネルに実装する必要があります。

+0

メイクファイルを使用していますが、どうすれば追加できますか?申し訳ありません私はまだCを学んでいます – leofontes

+0

私の答えを忘れてしまった。 –

+0

Davidの答えにコメントした内容を確認してください。@BodoThiesen – leofontes

関連する問題