標準関数ライブラリ V1.31 (libnustd.a)について 標準関数ライブラリ libnustd.a は ANSI準拠関数ライブラリです。 N64OSには、ANSI準拠ライブラリの関数は一部分しか含まれていないため、 それを補うために、このライブラリは作成されました。 コンソール入出力などを除くANSI準拠のほとんどの関数がソース付きで提供されて おり、ユーザーがカスタマイズすることも出来ます。 数値演算関数にはdouble版とfloat版があります。 メモリ割当てルーチンにはアラインメント調整つきのものも用意し、メモリ割当ての 整合性をチェックするルーチンもあります。 関数の詳細についてはマニュアル大全集のNuSYSTEMの下の標準関数リファ レンスまたは各関数ソースのコメントをご覧ください。 ○SGIコンパイラでの使用方法 標準関数ライブラリを使用するためには、Makefile に、以下のようにインクルード パスとライブラリパスを指定する必要があります。 N64KITDIR = /usr/local/n64kit NUSTDINCDIR = $(N64KITDIR)/nustd/include NUSTDLIBDIR = $(N64KITDIR)/nustd/lib (略) LCINCS = -I$(NUSTDINCDIR) LDFLAGS = $(MKDEPOPT) -nostdlib -L$(ROOT)/usr/lib -L$(NUSTDLIBDIR) \ -u sprintf -lultra_d -lnustd_d ROMバージョンを作る際は LDFLAGS を以下のようにします。 LDFLAGS = $(MKDEPOPT) -nostdlib -L$(ROOT)/usr/lib L$(NUSTDLIBDIR) \ -lultra_rom -lnustd malloc_memcheck(), mt_malloc_memcheck(), malloc_memdsp(), mt_malloc_memdsp() では、sprintf を使用しているため、これらの関数を使 用する場合には -u sprintf の記述をしなければならないことに注意してくだ さい。 ○exeGCC(N64)での使用方法 exeGCC には ANSI準拠のライブラリが付属しているため libnustd.a を使う 必要性は少ないかもしれません。 関数名・インクルードファイル名ともexeGCCと同じ名前を使用しているので、 このライブラリを使用する場合、以下のようにオプションを付ける必要があります。 N64KITDIR = c:\nintendo\n64kit NUSTDINCDIR = $(N64KITDIR)/nustd/include NUSTDLIBDIR = $(N64KITDIR)/nustd/lib .c.o: $(CC) -g -G 0 -c -nostdinc -I- -I$(NUSTDINCDIR) -I$(INC)/PR \ -I$(INC) -D_MIPS_SZLONG=32 -D_MIPS_SZINT=32 $< (略) LDFLAGS = $(MKDEPOPT) -L$(LIB) -L$(NUSTDLIBDIR) -L$(GCCDIR)/mipse/lib \ -lgultra_d -lnustd_d -lkmc exeGCCのANSIC準拠ライブラリのインクルードファイルを見に行かなくするように .c.o に -nostdinc -I- というオプションを追加しています。 ROMバージョンを作る時は LDFLAGS を以下のようにして下さい。 LDFLAGS = $(MKDEPOPT) -L$(LIB) -L$(NUSTDLIBDIR) -L$(GCCDIR)/mipse/lib \ -lgultra_rom -lnustd -lkmc ○標準関数ライブラリの再構築について nustd/src ディレクトリ下でmakeをかけることによりライブラリが再構築できます。 make のみで ROM バージョン(libnustd.a)、 make deb でデバッグバージョン (libnustd_d.a)のライブラリが出来ます。 (make をかける前には .o と.a を全て消しておくのが無難です。) Ver1.3 現在での ROM バージョンとデバッグバージョンの違いは、デバッグ情 報が含まれているかいないかと、オプティマイズレベルの違いです。 ○ライブラリの検索順について リンカーは -l オプションで宣言された順に関数の検索を行います。 同じ関数が各ライブラリに含まれている場合、ライブラリの順によりリンクされる オブジェクトが異なるため注意が必要です。 Ver1.1 以前では、N64OS に含まれている関数と重複している関数が存在して いましたが、Ver1.3 現在では重複しないように、それらの関数の名前が変更 されています。変更された関数と、変更後の名前の対応は以下の通りです。 sqrtf() --> _nsqrtf() strchr() --> _nstrchr() strlen() --> _nstrlen() memcpy() --> _nmemcpy() ldiv() --> _nldiv() sinf() --> _nsinf() cosf() --> _ncosf() ○標準関数ライブラリの注意事項 ・errno は使用できません。 ・sin(),cos() などに引数の型の最大に近い値を入れた時の動作の保証はあり ません。浮動小数の精度の問題もありますし、角度が大きな値にならないよ うにプログラムして下さい。 ・malloc() は複数スレッドからの同時アクセスが発生した場合の対策が行わ れていません。複数スレッドに対応した malloc() として mt_malloc() が 用意されています。 ・malloc() は16バイトアラインです。 ・memalign()で確保したエリアは、realloc するとアラインメントの保証は無 くなります。 ・setjmp() では、FPUのレジスタの保存は行っていません。
Name |
Last commit
|
History
|
Last Update |
---|---|---|
.. | ||
CVS | ||
include | ||
src | ||
GNUmakefile | ||
README.TXT | ||
RELNOTE.TXT |