コンパイルの設定

CCompilerDriverパッケージを使うと,コンピュータにインストールされているCコンパイラが使えるようになる.これにより,Cソースコードから実行ファイル,ライブラリ,オブジェクトファイルが構築できるようになる.CompilationTargetオプションを"C"と設定すると,CCompilerDriverパッケージはWolframシステムコンパイラによって自動的に呼び出される.これはWSTP 実行ファイルWolfram Libraries(Wolfram言語にリンクできるダイナミックリンクライブラリ)の構築にも便利である.

このセクションでは,Cコンパイラの使用のためにパッケージが提供する様々な制御について述べる.例題の多くはライブラリの作成を示しているが,一般原則は実行ファイルとオブジェクトファイルの作成にも当てはまる.

パッケージを使用するには,まずロードしなければならない.

これでCコードのファイルからライブラリが作成できる.

ソースファイルの例.

ライブラリを作って完全パスを返す.

適切なCコンパイラがない場合は,コンパイルは失敗し,メッセージが生成される.

Wolframシステムコンパイラから自動的に呼び出されたときにCコンパイラを設定したい場合は,Compile`$CCompilerOptionsが使える.

入力

Cソースは文字列としてもファイルとしても与えることができる.

C文字列からの入力

Wolfram言語文字列中にCコードがある場合は,コンパイルしてライブラリにすることができる.

パッケージをロードする.

Cコードを文字列にロードする.

C文字列をコンパイルしてライブラリにする.出力ファイルの名前が返される.プラットフォームに適した拡張子が与えられる.

出力はWolframシステムが自動的に選んだフォルダに作られる.出力フォルダは"TargetDirectory"オプションで変えられる.自動の場所は変数$CCompilerDefaultDirectoryで与えられる.

これをLibraryFunctionLoadでWolfram言語にロードして使うことができる.これは$CCompilerDefaultDirectory$LibraryPathに含まれているため便利である.

ソースファイルからの入力

1つまたは複数のファイルにCコードがある場合は,それをコンパイルしてライブラリにすることができる.

パッケージをロードする.

ソースファイルの例である.

コードをコンパイルしてライブラリにする.出力ファイルの名前が返される.プラットフォームに適した拡張子が与えられる.

ファイルの名前はリストで与えられる.これにより複数のソースファイルを含むことができる.また,ファイルからの入力とWolfram言語文字列からの入力を識別する.

ライブラリはWolframシステムが自動的に選んだフォルダに作られる.出力フォルダは"TargetDirectory"オプションで変えられる.自動の場所は変数$CCompilerDefaultDirectoryで与えられる.

このライブラリをLibraryFunctionLoadでWolfram言語にロードして使うことができる.これは$CCompilerDefaultDirectory$LibraryPathに含まれているため便利である.

出力

パッケージをロードする.

出力を作成するデフォルトの場所は$UserBaseDirectoryの中である.値は$CCompilerDefaultDirectoryで与えられる.

ソースファイルの例.

出力が作られる場所を変更する.フォルダ$BaseDirectoryを使うようにする.

ライブラリを削除する.

"TargetDirectory"出力が書き込まれるディレクトリ

出力用のディレクトリを設定するオプション

インクルードファイル

CCompilerDriverはインクルードファイルのためのパスを設定するオプションを2つ提供する.

"IncludeDirectories"はインクルードファイルに場所を追加する.文字列が1つまたは文字列のリストが使える.

"IncludeDirectories"の設定に加え,他の場所がデフォルトで加えられる.これらの場所にはWolfram LibrariesWSTPのためのインクルードファイルの場所が含まれる.実際の場所はオプション"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つ目のソースフラグメントをコンパイルしてライブラリにすることができる.

追加のオブジェクトファイルは別のビルドコマンドで作られたため,異なるオプションも取ることもできた.

"ExtraObjectFiles"コンパイルのためのコンパイラ特有の設定

ビルドにオブジェクトファイルを加えるためのオプション

テストとモニタリング

コンパイルプロセスがどのように実行されているかについての情報を得るのに役立つオプションがいくつかある.これは失敗がある場合に便利なことがある.

パッケージをロードし,サンプルソースファイルを探す.

"ShellOutputFunction"オプションはコンパイル実行時に生成されたメッセージを表示することができるオプションである.これはCコードを実行しながらエラーを見つけ出すのに便利である.

"ShellCommandFunction"オプションを使うと,コンパイラに渡されたコマンドを表示することができる.これは何が起こっているのか,詳細を確認するのに便利である.

"CreateBinary"オプションは実際のコンパイルの実行を避けるのに使うことができる.これはコンパイルするとどのようになるかを示し,結果をシェルスクリプトまたはバッチファイルに保管する.

ビルドを実行するbatファイルの内容を表示する.Unixオペレーティングシステム上では,これはtestLib.shと呼ばれる.

スクリプトを削除する.

"ShellOutputFunction"コンパイルプロセスの出力を表示する関数
"ShellCommandFunction"コンパイルプロセスで使うコマンドを表示する関数
"CreateBinary"コンパイルプロセスを実際に実行するかどうか

テストとモニタリングを制御するオプション

デバッグ

デバッガを使うとコードを実行しながら検査することができる.これには種々の特別なオプションを設定する必要がある.これらの設定には"CompileOptions"オプションが使えるが,実際の設定は各コンパイラごとに異なる.さらに,"CleanIntermediate"によって中間出力ファイルが削除されるのを防ぐ必要があるかもしれない.

"Debug"オプションはこれらすべてを行う.

パッケージをロードし,サンプルソースファイルを探す.

ビルドを実行してデバッグの結果を作成する.

一時ファイルはビルドの出力から作業ディレクトリを記し,手作業で削除する必要がある.上記例では,この作業ディレクトリはC:\Users\jfklein\AppData\Roaming\Mathematica\SystemFiles\LibraryResources\Windows-x86-64\Working-xavier-i2win-4848-4428-16である.

"Debug"ビルドの結果でデバッグを行えるようにするかどうか

Cレベルでのデバッグを設定するためのオプション

中間出力ファイル

コンパイルによってさまざまな中間出力ファイルが作られることがあるが,一般にはそれらは必要なものではなく,コンパイルの最後に削除される.また,どのような中間出力ファイルを作るかも決められる.例えばWindows上でダイナミックライブラリをビルドする場合,ビルドによってDLLファイルが作られるが,スタブLIBファイルとエキスポートEXPファイルも作られる.

Cコードをデバッグしたい場合は,中間出力ファイルを削除しない方が便利なことがよくある.

これらがすべてどのように削除されるかは,"CleanIntermediate"オプションによって制御される.以下の表に取り得る値をまとめる.

Trueすべての中間出力ファイルを削除する
Falseすべての中間出力ファイルを維持する
AutomaticWindowsにおけるスタブLIBファイルとエキスポートEXPファイル以外のすべての中間出力ファイルを削除する
Full中間出力ファイルであるかどうかを考慮しないで作業ディレクトリのすべてのファイルを削除する

パッケージをロードしてサンプルソースファイルを探す.一時ディレクトリも設定する.

デバッグの結果を作成するビルドを実行する.

Windows上でダイナミックライブラリ3ファイルが保存されることを示している.これはAutomaticのデフォルト設定の動作である.

これは"CleanIntermediate"Trueとしてコマンドを実行する.

DLLファイルのみが保管される.Unixについては,AutomaticTrueの設定に違いはない.

"CleanIntermediate"Falseに設定してライブラリを作成する.

作業ディレクトリは衝突を避けるために自動的に名前が付けられる.

以下は作業ディレクトリにある中間出力ファイルである.

"CleanIntermediate"中間出力ファイルを削除するかどうか

Cレベルのデバッグを設定するオプション

異なるシステムのためのビルド

"TargetSystemID"オプションを使うと,特定のシステム用の結果作成するための制御がいくらかできるようになる.デフォルトの設定では,Wolfram言語の現行バージョンに対応するものが作られる.しかし,コンパイラが他のタイプの出力を生成することができる場合は,"TargetSystemID"が使える.これは64ビットマシンで実行中に32ビットの結果を作成するとき等に便利なことがある.

パッケージをロードしてサンプルソースファイルを探す.

Windowsの64ビット版で動作するライブラリを作成する(コンパイラは64ビットWindows出力が生成できるものでなければならない).

"TargetSystemID"コンパイラ出力が使用される使用するシステム

ビルドする目標システムを設定するオプション

コンパイラの設定

CreateExecutable等のコンパイルコマンドを使うと,使用中のシステムに適した,利用可能なコンパイラが検索される.これがどのように行われるかについては個々のコンパイラのセクションに詳しく記載されている.

しかし,使用するコンパイラの設定に便利であろうオプションがいくつかある.

オプション"Compiler"はVisual StudioやGCC等のコンパイラのタイプを設定するのに使用される.これは複数のコンパイラがインストールされている場合,あるいはインストールされているコンパイラが自動的には検出されない場合に便利である.

オプション"CompilerInstallation"はコンパイラソフトウェアの場所を設定するのに使用される.コンパイラによっては場所を知らせるのに環境変数を使ったり,自動的にパス上に見付けられたりする.しかし,コンパイラがこのようなメカニズムを使って見つけられない場合は,このオプションが使える.

オプション"CompilerName"はコンパイラ実行ファイルの名前を設定するのに使われる.これはコンパイラソフトウェアが複数のコンパイラコマンド(例えばgccはg++としても知られる)をサポートしている場合に便利である.

"Compiler"どのコンパイラを使用するか
"CompilerInstallation"コンパイラソフトウェアの場所
"CompilerName"使用するコンパイルコマンドの名前

どのコンパイラを使うかを設定するオプション

これらのオプションを個々のコマンドについて設定することもできる.また,$CCompilerを使って大域的にも設定できる.これについては別のコンパイラの設定のセクションに記載されている.