個々のコンパイラ
CCompilerDriverパッケージを使うと,コンピュータにインストールされているCコンパイラが使えるようになる.これにより,Cソースコードから実行ファイル,ライブラリ,オブジェクトファイルが構築できるようになる.CompilationTargetオプションを"C"と設定すると,CCompilerDriverパッケージはWolframシステムコンパイラによって自動的に呼び出される.これはWSTP実行ファイルやWolfram Libraries(Wolfram言語にリンクできるダイナミックリンクライブラリ)の構築にも便利である.
このセクションでは,CCompilerDriverを使っていろいろなコンパイラを利用する方法をまとめる.パッケージがどのコンパイラを使うかをどのように決めるか,コンパイルを変更するにはどのようにすればよいか等について述べる.さらに,ここに記載されていないコンパイラはどのようにしたら使えるかについてのヒントも取り上げる.
デフォルトのコンパイラの選択
CCompilerDriverは初期化後,マシンにインストールされている,サポートされているコンパイラを探す.一般にコンパイラは環境変数またはパス上で見付かる.環境変数はインストーラがあるコンパイラによって設定される.例えばVisual Studioはその場所を示す環境変数を設定する.
CCompilers[]は実際に存在するコンパイラのみを示す.使用中のマシンのタイプで利用できる全コンパイラを示すこともできる.
これらの結果の中で,実際に見付かったのはVisual Studioのみである.Intelコンパイラ等の他のコンパイラはマシン上には見付からなかったが,これはIntelコンパイラがマシン上に存在しないという訳ではない.単に見付からなかったということである.
デフォルトのコンパイラは$CCompilerに割り当てることで変更できる.
別のコンパイラの設定
デフォルトに設定されていないコンパイラを使いたい場合は,コンパイラの設定にオプションを使うことで行える.
"Compiler"はコンパイラのタイプ,例えばVisual StudioやGCC等の設定に使用するオプションである.これは複数のコンパイラがインストールされている場合に便利なことがある.
"CompilerInstallation"はコンパリラソフトウェアの場所の設定に使用するオプションである.コンパイラによってはその場所を知らせる手段として環境変数を使ったり,自動的にパス上に見付けられるようにしたりする.しかし使用したいコンパイラがこのようなメカニズムでは見付からない場合は,このオプションが使える.
"CompilerName"はコンパイラ実行ファイルの名前の設定に使用するオプションである.これは,コンパイラソフトウェアが複数のコンパイラコマンドをサポートしている場合,例えばGCCはg++としても知られているが,そのような場合に便利である.
これらの設定をCCompilerDriverパッケージのあらゆるところで大域的に設定したい場合は,以下のように$CCompilerで設定することができる.
$CCompiler =
{"Compiler" -> CCompilerDriver`IntelCompiler`IntelCompiler,
"CompilerInstallation" -> "E:\\IntelCompiler"}
コンパイラ関数の呼出し1回きりのための設定を使いたい場合は,それをオプションとして設定することができる.以下に例を示す.
CreateLibrary[ {"sourceFile.c"}, "myLib",
"Compiler" -> CCompilerDriver`IntelCompiler`IntelCompiler,
"CompilerInstallation" -> "E:\\IntelCompiler"]
GCC
CCompilerDriverパッケージは,GNUコンパイラコレクション(http://gcc.gnu.org)のいくつかのバージョンについて,種々のプラットフォーム上でテストされている.
"SystemCompileOptions"のデフォルトの設定は"-O2"で,大きなファイルを生成せずに,最適化されたコードが返される.C言語デバッガでコードをデバッグしたい場合は,オプション"Debug"をTrueに設定する.また,"CompileOptions"を"-g"の設定で使い,"CleanIntermediate"をFalseに設定して,中間出力ファイルが保管されるようにすることもできる.
入手方法
LinuxやMac OS XのようなUnixタイプのオペレーティングシステムの多くには,GCCがすでにインストールされている.されていない場合は,比較的簡単な設定手順で加えることができる.
Visual Studio
CCompilerDriverパッケージはMicrosoft Visual Studioコンパイラ(http://www.microsoft.com/visualstudio)のいくつかのバージョンについて,種々のプラットフォーム上でテストされている.
テスト済みのMicrosoft Visual Studioのバージョン
"SystemCompileOptions"のデフォルトの設定は"/O2"で,大きなファイルを生成せずに,最適化されたコードが返される.C言語デバッガでコードをデバッグしたい場合は,オプション"Debug"をTrueに設定する.また,"CompileOptions"を"/Zi"の設定で使い,"CleanIntermediate"をFalseに設定して,中間出力ファイルが保管されるようにすることもできる.
入手方法
Visual StudioコンパイラはMicrosoft Visual Studio開発環境の一部としてよく使われる.コンパイラは無料の軽量バージョンであるMicrosoft Visual Studio Expressで入手することもできる.64ビットWindowsで実行される2012より前のバージョンについては,Microsoft .NET Framework 4とWindows SDKが必要である.
古いバージョンのVisual Studio Expressと/またはWindows SDKで64ビットWindowsをコンパイルする
64ビットのWindows($SystemIDを実行すると"Windows-x86-64"が得られる)とVisual Studio Express 2010以前のバージョンを使っている場合,Microsoft .NET Framework 4とWindows SDKをインストールする必要がある.
多くのユーザにとって,これはWindows 7にWindows SDKをインストールすことを意味する.「Windows 7」というのは単にSDKがサポートする最新バージョンのWindowsということであって,このSDKはWindows VistaでもWindows XPdも使える.どのWindows SDKをインストールするかについてはhttp://msdn.microsoft.com/ja-jp/windows/bb980924を参考のこと.
Visual Studio Express 2010については,Windows SDKのバージョン7.1が使える.これは本ドキュメントの執筆時点における最新版である.このバージョンは2010年5月にリリースされ,「Microsoft Windows SDK for Windows 7 and .NET Framework 4」と呼ばれている.これはhttp://go.microsoft.com/fwlink/?LinkID=191420からダウンロードできる.インストーラを実行するときは,Microsoft .NET frameworkのバージョン4がインストールされていないと警告メッセージのダイアログが現れる.まずMicrosoft .NET frameworkを取得してインストールしてからWindows SDKインストーラを使うことをお勧めする.
Visual Studio Express 2008については,Windows SDKのバージョン7.0を使う必要がある.このバージョンは2009年8月にリリースされ,「Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 Service Pack 1」と呼ばれている.これはhttp://go.microsoft.com/fwlink/?LinkID=150217&clcid=0x409からダウンロードできる.
MinGW
CCompilerDriverパッケージはWindowsにおけるGCCのネイティブWindowsポートであるMinGW(http://www.mingw.org)について,Windowsプラットフォーム上でテストされている.このソースのMinGWは64ビットバイナリを生成しないことに注意されたい.この機能は汎用Cコンパイラのセクションに記載のMinGW-w64で提供される.
"SystemCompileOptions"のデフォルトの設定は"-O2"で,大きなファイルを生成せずに,最適化されたコードが返される.C言語デバッガでコードをデバッグしたい場合は,オプション"Debug"をTrueに設定する.また,"CompileOptions"を"-g"の設定で使い,"CleanIntermediate"をFalseに設定して,中間出力ファイルが保管されるようにすることもできる.
入手方法
MinGWはメインサイト(http://www.mingw.org)で無料で入手できる.
Intelコンパイラ
$SystemID | Intel C/C++コンパイラのテスト済みのバージョン | |
Windows | 16.0 | |
Windows-x86-64 | 16.0 | |
Linux | 16.0 | |
Linux-x86-64 | 16.0 | |
MacOSX-x86-64 | 16.0 |
入手方法
IntelコンパイラはIntelアーキテクチャのWindows,Linux,Mac OS Xについて商用パッケージで利用できる.
DebianおよびUbuntuのユーザへの注意事項
DebianとUbuntuを実行中のユーザは,/bin/shがDebian Almquist shell (dash)にソフトリンクされている場合はCCompilerDriverを使用することができない.Intelから入手できる記事ではIntelコンパイラの変わりにbashにリンクするよう勧められている(http://software.intel.com/en-us/articles/using-intel-compilers-for-linux-with-ubuntu)また,CCompilerDriverがIntelコンパイラをサポートするためには,/bin/shはbashにリンクされていなければならない.
Cygwin
CCompilerDriverパッケージはWindowsプラットフォーム上でGCCのCygwinポートについてテストされている.-nocygwinオプションをサポートするCygwin GCCのみが,Wolframライブラリの作成に使える.-nocygwinオプションにはMinGW Cygwinパッケージがインストールされていることが必要であり,Cygwin GCCはCygwin DLLを必要としないバイナリを作成することができる.
入手方法
Cygwinはメインサイトhttp://www.cygwin.comから無料で入手できる.
汎用Cコンパイラ
汎用Cコンパイラドライバを使うと,一般的なCコンパイラコマンドラインオプションをサポートするほぼすべてのCコンパイラが使えるようになる.このコンパイラを使うためには,コンパイラの場所を指定する必要がある.さらに,コンパイラ名,コンパイラに特有のオプション,環境変数または実行パスを設定するスクリプトコマンドを設定する必要があることもある.
64ビットターゲット用MinGW
http://www.mingw.orgで入手できるコンパイラはWindowsの32ビットおよび64ビットの両方で動作するが,現時点では32ビットバイナリのみをコンパイルする.64ビットWolframライブラリを生成するためには,MinGW-w64(http://mingw-w64.sourceforge.netから入手可能)という別のプロジェクトを使う.その方法を以下に示す.
まず,http://mingw-w64.sourceforge.netからバイナリを入手してインストールする必要がある.64ビットシステムでこのMinGWを使うためには,名前に「w32」,「Win32」ではなく,「w64」または「Win64」が含まれているものを選ぶ.一般にファイル名はmingw-w64-bin_x86-64-mingw_20100414.zipのようなものである.
zipアーカイブファイルからファイルをコンピュータ上に抽出する.この例では,C:\MinGW-w64にあると仮定する.コンパイラはx86_64-w64-mingw32-gcc.exeという名前でC:\MinGW-w64\binに置かれる.
コンパイラを使うためには,まず汎用Cコンパイラドライバをロードする必要がある.
コンパイラの検証には,何かを出力する簡単な実行ファイルを作る.
今の設定のままではうまくいかない場合は,コンパイラの動作中にメッセージを表示する"ShellOutputFunction"オプションが便利なことがある.これについてはテストとモニタリングのセクションに記載されている.
CコンパイラがCompile等で呼び出されるたびにこのコンパイラを使うには,$CCompilerに割り当てる.
Wolframシステムコンパイラが自動的にCコンパイラを使うようにオプションを設定する別の方法に,Compile`$CCompilerOptionsを使うというものがある.これは例えばオプションをデバッグのために設定したい場合に便利である.
コンパイラがない場合
コンパイラがない場合は,CCompilerDriverを使うことはできない.その場合,CreateLibrary等の関数は警告メッセージを生成し,$Failedを返す.