Next: Known Build Problems, Previous: Notes for Package Builds, Up: Installing GMP [Index]
‘*-*-aix[34]*’上では共有ライブラリがデフォルトでは使用不可になっています。 ネイティブar
が利用できないからなのですが,共有ライブラリとしてビルドしたい時には次のようにオプション指定を行います。
./configure --enable-shared --disable-static
‘--disable-static’が必要になるのは,共有ライブラリビルド時にlibtoolがlibgmp.aをlibgmp.soへのsymlinkとして生成してしまい, .aしか認識しない古いld
が利用できるようになるからです。つまり,不幸にしてフル機能が使えるld
でない限りは共有ライブラリの利用が出来ないことになります。
‘arm*-*-*’システム上では,GCC 2.95.3以上では符号なし除算に関してバグが存在しており,結果がおかしくなることがあります。GMPの ‘./configure’ではGCC 2.95.4以降であることを要求します。
Compaq C++ をOSF 5.1上で使用すると,2種類のiostream
が使用でき,一つは標準のもの,もう一つは古い標準のものです(see ‘man iostream_intro’).
GMPは前者でしか利用できませんが,不幸にして後者がデフォルトになっていますので,利用する時にはきちんと
__USE_STD_IOSTREAM
を指定して次のように設定を行います。
./configure --enable-cxx CPPFLAGS=-D__USE_STD_IOSTREAM
ハードウェアが直接実行する浮動小数点演算では,特定の演算精度の設定が可能な制御モードが存在するケースがあります。例えば,x86システムにおける,単精度,倍精度,拡張倍精度のようなものです(x87 浮動小数点命令)。double
型を使用するGMP関数は,単精度モードではフル精度の保障ができません。この場合はもちろんGMPに限らず,全てのアプリケーションに影響が及びます。
上記のFreeBSDリリースに含まれるm4
は2番目と3番目の引数を無視してくれる評価関数を持っており,.asmファイルを処理するのには向いていません。‘./configure’ではこの問題を見つけてPATH
から別のm4を見つけて利用するようになっています。このバグはFreeBSD 9.3と10.0で解決されていますので,OSをアップグレードするかGNU m4を使うようにして下さい。FreeBSDパッケージシステムでは,GNU m4を‘gm4’という名前でインストールしますが,この名前ではGMPは認識しません。
GMP 6.0以降では‘ABI=32’をFreeBSD/amd64 1.0以降の環境ではサポートしません。limits.h
が壊れているせいで,GMPが動作しなくなってしまいます。
MS-DOS上ではDJGPPを使い,MS Windows上ではCygwin, DJGPP, MINGWでGMPをビルドできます。この3つのコンパイラ環境は,いずれもGCCとGNUツールの優れた移植です。
MicrosoftはInterix “Services for Unix”をリリースしており,この環境下でWindows用のGMPをビルドできます(通常の‘./configure’を使う)。但しこれは有料ソフトウェアです。
‘*-*-cygwin*’, ‘*-*-mingw*’,‘*-*-pw32*’環境下では,オプションなしで実行すると静的ライブラリしかビルドできません。DLLを生成する時には 次のように指定します。
./configure --disable-static --enable-shared
静的ライブラリと動的ライブラリ(DLL)を両方ビルドすることはできず,それぞれに対しては異なるディレクティブを含むgmp.hを使うことになります。
MINGW環境下でビルドしたDLL版GMPはMicrosoft C で利用可能です。Libtoolは.libフォーマットのインポートライブラリを生成しませんので,MSのlib
コマンドを使って下記のように生成し,インストールディレクトリにコピーして下さい。libmp やlibgmpxxに対しても同様にインポートライブラリを生成できます。
cd .libs lib /def:libgmp-3.dll.def /out:libgmp-3.lib
MINGWはCのランタイムライブラリである‘msvcrt.dll’をI/O用に使いますので,GMPのI/Oルーチンを利用するアプリケーションは必ず‘cl /MD’オプション付きでコンパイルして下さい。これ以外のMS Cのランタイムライブラリが必要な場合,例えばGMPの文字列関数やアプリケーションへのI/Oが必要な場合も,同様にリンクして下さい。
‘m68k’は68000を意味します。‘m68020’以上のCPUでは更に性能向上が見込めます。 ‘m68360’はCPU32シリーズのCPUです。‘m68302’は“ドラゴンボール(Dragonball)”シリーズのCPUで,これらは全て‘m68000’のCPUファミリーに属します。
これらのNetBSDのリリースに含まれるm4
は2番目と3番目の引数を無視する評価関数が入っており,.asmファイルを処理するには適切ではありません。‘./configure’はこの問題を認識してPATH
から使える他のm4を探して適用します。
このバグはNetBSD 6で取れましたので,OSをアップグレードするかGNU m4を利用して下さい。NetBSDのパッケージシステムはGNU m4
を‘gm4’という名前でインストールしますので,GMPが認識できなくなります。
このOpenBSDリリースに含まれるm4
は eval
のバグがあり,.asmファイルの処理に向いていません。
‘./configure’はこの問題に対処するため,PATH
が通っている他のm4を見つけて使用します。このバグは
OpenBSD 2.7で取れましたので,OSをアップグレードするかGNU m4を利用して下さい。
GMPでは,‘power*’ や ‘powerpc*’といったCPUタイプごとに,相互に使用できない命令を使っています。従って,正しいCPUを指定することは大切です。現在のGMP実装では,アセンブラコードで共通に使用できる命令サブセットをサポートしていません。
どちらのCPUタイプでも実行できるようにするには,汎用Cコードを使用し(--disable-assembly),
適切なコンパイラオプション(gcc
用には‘-mcpu=common’等)を指定して下さい。
CPU ‘rs6000’ (CPUではなくワークステーションの種別)
はconfig.subで利用できますが,これは現状,--disable-assemblyと等価ではありません。
‘sparcv8’や‘supersparc’ファミリーは,標準の‘sparc’用のV7コードを高速に実行できます。
32-bit と 64-bit Sparcの両方に対応したGMPのアセンブラコードは,
“アプリケーションレジスタ” g2
, g3
,g4
を痛めつけます(?)。同様のことはGCCのデフォルトオプションである‘-mapp-regs’を使っても起こります(see SPARC Options in Using the GNU Compiler Collection (GCC))。
このアセンラコードは特別なV9に対するオプション‘-mcmodel=embmedany’ (g4
レジスタをデータセグメントのポインタとして利用)にも,これらのレジスタを特別な目的で使用する予定のアプリケーションにも向いていません。
こういう場合はGMPビルド時に
--disable-assemblyを指定し,アセンブラコードを使わないようにした方がいいでしょう。
/usr/bin/m4
が入っていないので,.asmファイルの処理ができません。
そのため,‘./configure’は自動的に
/usr/5bin/m4
を使用するようになっており,大体これで大丈夫かと思います(ダメならGNU m4を使います)。
‘i586’, ‘pentium’,‘pentiummmx’用のコードはP5 Pentium CPUにも有用ですが,Intel P6クラスのCPUではかえって低速になります(PPro, P-II, P-III). どちらでも使えるバイナリを作りたいのであれば,‘i386’を選択して下さい。
CPUではMMX命令を使用可能でもアセンブラがサポートしていない場合は,警告が出てMMXが使用できません。 低レベルのビルドを行ってMMXコードを適用すれば,標準の整数コードよりも高速に実行できるようになります。同じことはSSE2にも言えます。
古い‘gas’はMMX命令をサポートしておらず,特にFreeBSD 2.2.8やもっと新しいOpenBSD 3.1に入っているversion 1.92.3はダメです。
Solaris 2.6と2.7のas
は,movq
命令を実行するとレジスターに対して不正なオブジェクトコードを生成してしまいます。従って,MMX命令も使えません。使いたいのであれば,新しいgas
をインストールして下さい。
Next: Known Build Problems, Previous: Notes for Package Builds, Up: Installing GMP [Index]