コンパイルの設定
CCompilerDriverパッケージを使うと,コンピュータにインストールされているCコンパイラが使えるようになる.これにより,Cソースコードから実行ファイル,ライブラリ,オブジェクトファイルが構築できるようになる.CompilationTargetオプションを"C"と設定すると,CCompilerDriverパッケージはWolframシステムコンパイラによって自動的に呼び出される.これはWSTP 実行ファイルやWolfram Libraries(Wolfram言語にリンクできるダイナミックリンクライブラリ)の構築にも便利である.
このセクションでは,Cコンパイラの使用のためにパッケージが提供する様々な制御について述べる.例題の多くはライブラリの作成を示しているが,一般原則は実行ファイルとオブジェクトファイルの作成にも当てはまる.
適切なCコンパイラがない場合は,コンパイルは失敗し,メッセージが生成される.
Wolframシステムコンパイラから自動的に呼び出されたときにCコンパイラを設定したい場合は,Compile`$CCompilerOptionsが使える.
入力
Cソースは文字列としてもファイルとしても与えることができる.
C文字列からの入力
Wolfram言語文字列中にCコードがある場合は,コンパイルしてライブラリにすることができる.
C文字列をコンパイルしてライブラリにする.出力ファイルの名前が返される.プラットフォームに適した拡張子が与えられる.
出力はWolframシステムが自動的に選んだフォルダに作られる.出力フォルダは"TargetDirectory"オプションで変えられる.自動の場所は変数$CCompilerDefaultDirectoryで与えられる.
これをLibraryFunctionLoadでWolfram言語にロードして使うことができる.これは$CCompilerDefaultDirectoryが$LibraryPathに含まれているため便利である.
ソースファイルからの入力
1つまたは複数のファイルにCコードがある場合は,それをコンパイルしてライブラリにすることができる.
コードをコンパイルしてライブラリにする.出力ファイルの名前が返される.プラットフォームに適した拡張子が与えられる.
ファイルの名前はリストで与えられる.これにより複数のソースファイルを含むことができる.また,ファイルからの入力とWolfram言語文字列からの入力を識別する.
ライブラリはWolframシステムが自動的に選んだフォルダに作られる.出力フォルダは"TargetDirectory"オプションで変えられる.自動の場所は変数$CCompilerDefaultDirectoryで与えられる.
このライブラリをLibraryFunctionLoadでWolfram言語にロードして使うことができる.これは$CCompilerDefaultDirectoryが$LibraryPathに含まれているため便利である.
出力
出力を作成するデフォルトの場所は$UserBaseDirectoryの中である.値は$CCompilerDefaultDirectoryで与えられる.
出力が作られる場所を変更する.フォルダ$BaseDirectoryを使うようにする.
インクルードファイル
CCompilerDriverはインクルードファイルのためのパスを設定するオプションを2つ提供する.
"IncludeDirectories"はインクルードファイルに場所を追加する.文字列が1つまたは文字列のリストが使える.
"IncludeDirectories"の設定に加え,他の場所がデフォルトで加えられる.これらの場所にはWolfram LibrariesとWSTPのためのインクルードファイルの場所が含まれる.実際の場所はオプション"SystemIncludeDirectories"で設定される.
このビルドコマンドは$UserBaseDirectoryを追加のインクルードディレクトリとして加える.
"IncludeDirectories" | インクルードパスに場所を加える |
"SystemIncludeDirectories" | デフォルトのインクルード場所(Wolfram LibrariesとWSTPを含む) |
追加のビルドライブラリ
CCompilerDriverパッケージには,ビルドの中の追加のライブラリを使うための手助けとなるいくつかのオプションがある.
"LibraryDirectories"はライブラリの検索の場所を追加し,"Libraries"はライブラリ名を与える.どちらも文字列を1つ,または文字列のリストを取る.ライブラリの名前を加えると,それは通常不完全に切り取られた名前となる.
これらの設定に加え,他の場所やライブラリを加えることもできる.これらにはWSTPライブラリが見付かるようにするための設定が含まれる.これらの標準設定を変更したい場合はオプション"SystemLibraryDirectories","SystemLibraries"が使える.
このビルドコマンドはWindowsライブラリVersion.libを追加のライブラリとして加える.
"LibraryDirectories" | ライブラリ検索パスに場所を加える |
"Libraries" | ビルドに含まれるようにライブラリを追加する |
"SystemLibraryDirectories" | ライブラリのデフォルトの場所(WSTPを含む) |
"SystemLibraries" | デフォルトのライブラリ(WSTPを含む) |
コンパイラの設定
CCompilerDriverパッケージには,コンパイルプロセスで生成されたコードを変更するためのいくつかのオプションがある.
"CompileOptions"オプションはコンパイラ特有のフラグ加える.これは文字列または文字列のリストを取る.これらに加え,他のデフォルト設定も加えられる.これらは"SystemCompileOptions"で設定される.
このビルドコマンドはVisual Studioコンパイラの警告をオンにする.
"CompileOptions"オプションを設定すると,コンパイラについて設定される可能性のあるデフォルトの設定はクリアされる.デフォルトの設定についてはコンパイラ専用のドキュメントに記載されている.
"Defines"オプションはコンパイラ特有のフラグを加える.これは文字列,文字列のリスト,または文字列から文字列への規則のリストを取る.
このビルドコマンドはDEBUGプリプロセッサマクロを定義する.
このビルドコマンドはDEBUGプリプロセッサマクロと,特定の値に設定されたBUILDNUMBERプリプロセッサシンボルを定義する.
"CompileOptions" | コンパイルのためのコンパイラ特有の設定 |
"SystemCompileOptions" | コンパイルのためのデフォルトのコンパイラ設定 |
"Defines" | コンパイルに加えるためのプリプロセッサの定義 |
追加のオブジェクトファイル
CCompilerDriverパッケージは通常コードをコンパイル・リンクして出力ライブラリまたは実行ファイルにする.しかし,ビルドが追加のオブジェクトファイルを含むようにすることも可能である.これはファイルを別の設定でコンパイルしたいときに便利なことがある.
"ExtraObjectFiles"オプションは追加のオブジェクトファイルを加える.これはオブジェクトファイルへの絶対パスの文字列を取る.オブジェクトファイルのリストも取ることができる.
SymbolicCを使ってサンプルコードを作成する.まずパッケージをロードする.
別のソースコードフラグメントである.これはオブジェクトファイルで定義されている関数を呼び出す.
前に作成したオブジェクトファイルを使い,2つ目のソースフラグメントをコンパイルしてライブラリにすることができる.
追加のオブジェクトファイルは別のビルドコマンドで作られたため,異なるオプションも取ることもできた.
テストとモニタリング
コンパイルプロセスがどのように実行されているかについての情報を得るのに役立つオプションがいくつかある.これは失敗がある場合に便利なことがある.
"ShellOutputFunction"オプションはコンパイル実行時に生成されたメッセージを表示することができるオプションである.これはCコードを実行しながらエラーを見つけ出すのに便利である.
"ShellCommandFunction"オプションを使うと,コンパイラに渡されたコマンドを表示することができる.これは何が起こっているのか,詳細を確認するのに便利である.
"CreateBinary"オプションは実際のコンパイルの実行を避けるのに使うことができる.これはコンパイルするとどのようになるかを示し,結果をシェルスクリプトまたはバッチファイルに保管する.
ビルドを実行するbatファイルの内容を表示する.Unixオペレーティングシステム上では,これはtestLib.shと呼ばれる.
"ShellOutputFunction" | コンパイルプロセスの出力を表示する関数 |
"ShellCommandFunction" | コンパイルプロセスで使うコマンドを表示する関数 |
"CreateBinary" | コンパイルプロセスを実際に実行するかどうか |
デバッグ
デバッガを使うとコードを実行しながら検査することができる.これには種々の特別なオプションを設定する必要がある.これらの設定には"CompileOptions"オプションが使えるが,実際の設定は各コンパイラごとに異なる.さらに,"CleanIntermediate"によって中間出力ファイルが削除されるのを防ぐ必要があるかもしれない.
一時ファイルはビルドの出力から作業ディレクトリを記し,手作業で削除する必要がある.上記例では,この作業ディレクトリはC:\Users\jfklein\AppData\Roaming\Mathematica\SystemFiles\LibraryResources\Windows-x86-64\Working-xavier-i2win-4848-4428-16である.
中間出力ファイル
コンパイルによってさまざまな中間出力ファイルが作られることがあるが,一般にはそれらは必要なものではなく,コンパイルの最後に削除される.また,どのような中間出力ファイルを作るかも決められる.例えばWindows上でダイナミックライブラリをビルドする場合,ビルドによってDLLファイルが作られるが,スタブLIBファイルとエキスポートEXPファイルも作られる.
Cコードをデバッグしたい場合は,中間出力ファイルを削除しない方が便利なことがよくある.
これらがすべてどのように削除されるかは,"CleanIntermediate"オプションによって制御される.以下の表に取り得る値をまとめる.
True | すべての中間出力ファイルを削除する |
False | すべての中間出力ファイルを維持する |
Automatic | WindowsにおけるスタブLIBファイルとエキスポートEXPファイル以外のすべての中間出力ファイルを削除する |
Full | 中間出力ファイルであるかどうかを考慮しないで作業ディレクトリのすべてのファイルを削除する |
パッケージをロードしてサンプルソースファイルを探す.一時ディレクトリも設定する.
Windows上でダイナミックライブラリ3ファイルが保存されることを示している.これはAutomaticのデフォルト設定の動作である.
これは"CleanIntermediate"をTrueとしてコマンドを実行する.
DLLファイルのみが保管される.Unixについては,AutomaticとTrueの設定に違いはない.
"CleanIntermediate"をFalseに設定してライブラリを作成する.
作業ディレクトリは衝突を避けるために自動的に名前が付けられる.
異なるシステムのためのビルド
"TargetSystemID"オプションを使うと,特定のシステム用の結果作成するための制御がいくらかできるようになる.デフォルトの設定では,Wolfram言語の現行バージョンに対応するものが作られる.しかし,コンパイラが他のタイプの出力を生成することができる場合は,"TargetSystemID"が使える.これは64ビットマシンで実行中に32ビットの結果を作成するとき等に便利なことがある.
Windowsの64ビット版で動作するライブラリを作成する(コンパイラは64ビットWindows出力が生成できるものでなければならない).
コンパイラの設定
CreateExecutable等のコンパイルコマンドを使うと,使用中のシステムに適した,利用可能なコンパイラが検索される.これがどのように行われるかについては個々のコンパイラのセクションに詳しく記載されている.
しかし,使用するコンパイラの設定に便利であろうオプションがいくつかある.
オプション"Compiler"はVisual StudioやGCC等のコンパイラのタイプを設定するのに使用される.これは複数のコンパイラがインストールされている場合,あるいはインストールされているコンパイラが自動的には検出されない場合に便利である.
オプション"CompilerInstallation"はコンパイラソフトウェアの場所を設定するのに使用される.コンパイラによっては場所を知らせるのに環境変数を使ったり,自動的にパス上に見付けられたりする.しかし,コンパイラがこのようなメカニズムを使って見つけられない場合は,このオプションが使える.
オプション"CompilerName"はコンパイラ実行ファイルの名前を設定するのに使われる.これはコンパイラソフトウェアが複数のコンパイラコマンド(例えばgccはg++としても知られる)をサポートしている場合に便利である.
これらのオプションを個々のコマンドについて設定することもできる.また,$CCompilerを使って大域的にも設定できる.これについては別のコンパイラの設定のセクションに記載されている.