DMD Compiler for Windows
- 要件とダウンロード
- インストール
- 例
- コンパイラの引数とスイッチ
- ファイル
- リンク
- 環境変数
- sc.ini 初期化ファイル
- よくあるインストール時の問題
- Windows版とLinux版の違い
- D インターフェースファイル
- ライブラリの構築
- dmdのコンパイル
- "Phobos"のコンパイル
要件とダウンロード
- DMDコンパイラ
- Windows オペレーティングシステム、Windows 7 以降、32 ビットまたは 64 ビット
- dmc.zip(CおよびC++コンパイラ)をダウンロード (Win32用)(必須ではないが、Windows版dmdの補完用)
インストール
コンソールウィンドウを開く(Windowsの場合は、 [スタート][コマンドプロンプト]をクリックする)。 すべてのツールはコマンドラインツールであり、 コンソールウィンドウから実行される。 ルートディレクトリに切り替える。 ルートディレクトリ内のファイルを解凍する。dmd.zip は、 すべてのファイルを含む\dmd2 ディレクトリを作成する。dmc.zip は、 すべてのファイルを含む\dm ディレクトリを作成する。
典型的なセッションは以下のようになるだろう。
C:\Documents and Settings\Your Name>cd \ C:\>unzip dmd.zip C:\>unzip dmc.zip
"例:"
実行:
\dmd2\windows\bin\shell all.sh
\dmd2\samples\d ディレクトリ内のいくつかの小規模な例を参照する。
コンパイラ引数とスイッチ
- dmd ファイル...- スイッチ...
- ファイル...
-
ファイル拡張子 拡張子 ファイルの種類 なし Dソースファイル .c Cソースファイル .d Dソースファイル .dd Ddocソースファイル .di D インターフェースファイル .i プリプロセスされたCソースファイル .obj リンクするオブジェクトファイル .lib 検索するオブジェクトコードライブラリ .exe 出力実行ファイル .def モジュール定義ファイル .res リソースファイル - @cmdfile
- cmdfileが環境変数である場合、 コンパイラの引数とスイッチをその変数の値から読み取る。 それ以外の場合は、コンパイラの引数とスイッチを テキストファイルcmdfile から読み取る。 このファイルには、ハッシュ記号 (#) で始まる1行のコメントを含めることができる。
- -allinst
- すべてのテンプレート実装用のコードを生成する
- -betterC
-
コンパイラを調整して、Dをより優れたCとして実装する:
- D_BetterC バージョンを事前定義する。
- 式が失敗した場合、 Dランタイム内の関数ではなく、Cランタイムライブラリのassert失敗関数を呼び出す。
- 配列のオーバーフローは、 Dランタイムの関数ではなく、Cランタイムライブラリのエラー関数を呼び出す。
- 最終的なスイッチエラーは、 Dランタイムの関数ではなく、Cランタイムライブラリのエラー関数を呼び出す。
- phobosランタイムライブラリと自動的にリンクしない。
- モジュールのコンストラクタとデストラクタが生成されないため、 静的および 共有静的コンストラクタと デストラクタは 呼び出されない。
- ModuleInfo 生成されない。
- TypeInfo 構造体用のインスタンスは生成されない。
- -boundscheck=[on|safeonly|off ]
-
境界チェックが有効かどうかを制御する。
- on: すべてのコードで境界チェックが有効になる。これがデフォルト。
- safeonly: 境界チェックは、@safe のコードでのみ有効になる。 これは、ビルド時のデフォルト設定である -release。
- off: 境界チェックは完全に無効になる(@safeコードでも)。 このオプションは慎重に使用すべきであり、 パフォーマンスを向上させるための最終手段として使用すべきである。@safe 境界チェックを無効にすることが有益であるかどうかは、ベンチマークで確認すること。
- -c
- コンパイルのみを行い、リンクはしない
- -check=[assert|bounds|in|invariant|out|switch][= [on|off]]
-
特定のチェックを有効または無効にするには、デフォルト、-boundscheck、-release、-unittestオプションを上書きする。
- assert:アサーションのチェック
- bounds: 配列の境界
- in: 契約内
- invariant: クラス/構造体の不変条件
- out: 契約の出力
- switch:final switch 失敗のチェック
- on または指定されていない場合:指定チェックが有効。
- off: 指定されたチェックは無効である。
- -check=[h|help|? ]
- 利用可能なすべてのチェックの情報を表示する
- -checkaction=[D|C|halt|context ]
-
アサートまたは配列境界チェックが失敗した場合、
またはfinal switch エラーが発生した場合の動作を設定する。
- D: デフォルトの動作。回復不可能なAssertError をスローする。
- CCランタイムライブラリのassert失敗関数を呼び出す。
- halt:halt命令を実行し、プログラムを終了する。
- context: 復旧不可能なAssertError の一部としてエラーコンテキストを表示する。
- -checkaction=[h|help|? ]
- 利用可能なすべてのチェックアクションの情報を表示する
- -color
- 色付きコンソール出力を有効にする
- -color=[on|off|auto ]
-
色付きのコンソール出力を表示する。デフォルトはターミナルの機能に依存する。
- autottyが検出された場合は色付き出力を使用する(デフォルト)
- on:常に色付き出力を使用する。
- off: カラー出力は使用しない。
- -conf=filename
- ファイル名で指定された 設定ファイルを使用する
- -cov
- コードカバレッジ解析を行う
- -cov=ctfe
- CTFE中に実行されたコードをカバレッジレポートに含める
- -cov=nnn
- コードカバレッジ解析を実行し、.lst ファイルにレポートを生成する。
- -cpp=filename
- 通常、関連するCコンパイラで使用されるCプリプロセッサが ImportCファイルの前処理に使用されるが、 これは-cpp スイッチによって無効化される。
- -D
-
ソースからドキュメントを生成する。
注釈:セキュリティ上の考慮事項に注意すること。
- -Ddディレクトリ
- ドキュメントファイルをディレクトリに書き込む。 -op 元のパッケージ階層を保持する必要がある場合は、これを使用できる
- -Dfファイル名
- ドキュメントファイルをfilename に書き込む
- -d
- 非推奨の機能や非推奨の属性を持つシンボルの使用を黙認する 。
- -de
- 非推奨の機能やシンボルが使用された場合、エラーを発行する(コンパイルを中断する)
- -dw
- 非推奨の機能やシンボルが使用された場合にメッセージを表示する(デフォルト)
- -debug
- デバッグコードをコンパイルする
- -debug=level
- デバッグレベルでコンパイルする<level>
- -debug=ident
- デバッグ用 識別子をコンパイルident
- -debuglib=name
- シンボリックデバッグ用にコンパイルする際に、デフォルトライブラリとしてlibnameをリンクする。phobos.lib の代わりに使用する。 libnameが指定されていない場合は、デフォルトライブラリはリンクされない。
- -defaultlib=name
- シンボリックデバッグ用にコンパイルしていない場合、phobos.lib の代わりにデフォルトライブラリとしてlibname をリンクする。 libnameが指定されていない場合は、デフォルトライブラリはリンクされない。
- -deps
- モジュール依存関係を表示 (インポート/ファイル/バージョン/デバッグ/ライブラリ)
- -deps=filename
- filename を指定しない場合、モジュールの依存関係 (imports/file/version/debug/lib)を表示する。 filename を指定した場合、モジュールの依存関係をテキストとしてfilename に書き出す (imports のみ)。
- -dllimport=value
-
ルートモジュールで定義されていない場合に、dllimportによって暗黙的にインポートするグローバル変数
- none: なし
- defaultLibsOnly: druntime/Phobos のシンボルのみ
- all: すべて
- -extern-std=標準
-
サポートされている標準規格は以下の通り:
- c++98: C++98 の名前のマングリングを使用、__traits(getTargetInfo, "cppStd") を199711
- c++11(デフォルト):C++11の名前マングリングを使用する。__traits(getTargetInfo, "cppStd") を201103
- c++14: C++14 の名前の短縮化を使用する。__traits(getTargetInfo, "cppStd") を201402
- c++17: C++17の名前の短縮形を使用する、__traits(getTargetInfo, "cppStd") を201703
- c++20: C++20 の名前の短縮形を使用する、__traits(getTargetInfo, "cppStd") を202002
- -extern-std=[h|help|? ]
- サポートされているすべての規格をリストアップする
- -fIBT
- 間接分岐追跡コードを生成
- -fPIC
- 位置非依存コードを生成
- -fPIE
- 位置非依存実行ファイルを生成
- -g
- CodeView シンボリックデバッグ情報を追加する。 Windowsでのデバッグを参照。
- -gdwarf=version
- バージョン値は 3、4、5のいずれかであり 、デフォルトは 3 である。
- -gf
- シンボリックデバッグ情報は、コンパイルされたコードが参照するすべての型に対して出力される。 定義が現在コンパイルされていないインポートされたファイルにある場合でも同様である。
- -gs
- 常にスタックフレームを出力する
- -gx
- 関数終了時にスタックフレームのメモリを上書きするスタックストンプコードを追加する。
- -H
- Dインターフェースファイルを生成
- -Hd=directory
- Dインターフェースファイルをディレクトリに書き込む。 -op 元のパッケージ階層を保持する必要がある場合は、これを使用できる。
- -Hf=filename
- 「ヘッダー」ファイルをfilename に 書き込む
- -HC[=[?|h|help|silent|verbose ]]
-
C++の「ヘッダー」相当をstdoutに書き込む。設定は:",
- ?|h|help
- C++の「ヘッダー」ファイル生成で利用可能なオプションの一覧
- silent
- のみ extern(C[++])宣言をリストする(デフォルト)
- 詳細
- 無視された宣言(extern(D)など)にもコメントを追加する
- -HCd=directory
-
C++の「ヘッダー」ファイルをディレクトリに書き込む。-HCf=
が指定されていない場合は無視される - -HCf=filename
- C++の「ヘッダー」ファイルをstdoutではなくfilenameに 書き込む
- --help
- ヘルプを表示して終了
- -I=directory
- インポートもディレクトリ で探す
- -i[=pattern ]
-
「インクルードインポート」モードを有効にし、コンパイラがインポートされたモジュールを コマンドラインで指定されたかのようにコンパイルに含める。デフォルトでは、 このオプションが有効になっている場合、druntime/phobos以外のすべてのインポートされたモジュールが含まれる。 この動作は、-i=<pattern> 経由でパターンを指定することで上書きできる。-i=<package> の形式のパターンは「インクルードパターン」であり、 の形式のパターンは「 -i=-<package> の形式のパターンは「除外パターン」である。 包括パターンは パターンに一致する名前のすべてのモジュールを含めるが、除外パターンはそれらを除外する。 例えば、foo.bar のパッケージ内のすべてのモジュールは、-i=foo.bar を使用して含めることができ、-i=-foo.bar を使用して除外できる 。 完全修飾名の各コンポーネントは、パターンに完全に一致しなければならないことに注意 。したがって、foo.bar というパターンは、foo.barx という名前のモジュールには一致しない。
druntime/phobos を除外するデフォルトの動作は、 標準的な除外セットを内部的に追加することで実現されている。すなわち、-i=-std -i=-core -i=-etc -i=-object である。 これらの設定は、-i=std -i=core -i=etc -i=object で上書きできることに注意。
モジュールが複数のパターンに一致する場合、一致はコンポーネントの長さによって優先順位が付けられ、 より多くのコンポーネントに一致するものが優先される(すなわち、foo.bar.baz というパターンはfoo.bar よりも優先される)。
デフォルトでは、どのパターンにも一致しないモジュールはすべて含まれる。しかし、 少なくとも1つの包括的なパターンが指定されている場合、どのパターンにも一致しないモジュールは 除外される。この動作は、-i=. を使用してデフォルトで含めるか、-i=-. を使用して デフォルトで除外するように上書きできる。
-i=... オプションを複数指定することができ、それぞれにパターンを追加できることに注意。
- -identifiers=table
-
非ASCII値に使用する識別子テーブル を設定する。
- UAX31: UAX31
- c99: C99
- c11: C11
- all: すべて、最も制限のないセットであり、他のすべてを含む(デフォルト)
- -identifiers-importc=table
-
非ASCIIの値に使用する識別子テーブル を設定する。
- UAX31: UAX31
- c99: C99
- c11: C11 (デフォルト)
- all: すべて、最も制限の少ないセットで、他のすべてを含む
- -ignore
- 非推奨フラグ、現在ではサポートされていないプラグマは常に無視される
- -inline
- インライン関数はコンパイラの判断で使用される。 これはパフォーマンスを向上させるが、 デバッガの使用が難しくなるという代償を伴う。
- -J=directory
- ImportExpressions のファイルを検索する場所 。 ImportExpressionsを使用するには、このスイッチが必要である。 pathは ; で区切られた パスのリストである。-J を複数回使用でき、パスは 同じ順序で検索される。
- -L=linkerflag
- リンカーフラグをリンカーoptlink.exeに渡す。 例えば、ld
- -lib
- オブジェクトファイルではなくライブラリファイルを出力として生成する。 すべてのコンパイル済みソースファイル、およびコマンドラインで指定されたオブジェクトファイルとライブラリ ファイルが出力ライブラリに挿入される。 コンパイル済みソースモジュールは、粒度を向上させるために複数のオブジェクトモジュールに分割される場合がある 。 ライブラリ名は、最初にコンパイルされたソースモジュール名から取得される。この名前は、 スイッチで -of。
- -lowmem
- コンパイラのガベージコレクタを有効にすると、 コンパイラのメモリ要件は減少するが、コンパイル時間は増加する。
- -m32
- -m32mscoff
- 32ビットコードを生成し、MS-COFFオブジェクトファイルを書き出す(非推奨の-m32オプションを使用する)
- -m64
- 生成されたオブジェクトコードはMS-COFFであり、 Microsoft Visual Studio 10 以降のコンパイラで使用されることを想定している。
- -main
- コンパイル時にデフォルトのmain() 関数を追加する。これは、 ライブラリの単体テストを行う際に有用である。 手動でエントリーポイント関数を定義することなく、ライブラリ内の単体テストを実行できる 。
- -makedeps[=filename
- Makefile互換形式で依存関係を表示する。 filenameが省略された場合は、stdoutに出力される。 出力されるターゲットは、コンパイルされた成果物(実行ファイル、オブジェクトファイル、ライブラリ)である 。
- 出力される依存関係は、インポートされたモジュールとインポートされた文字列ファイル(-J スイッチ経由)である。 依存関係またはターゲットのファイル名に特殊文字が含まれる場合は、GNU Make の方式に従ってエスケープされる。
- -man
- このページでデフォルトのブラウザを開く
- -map
- .map ファイルを生成する
- -mcpu=id
- コード生成のターゲットアーキテクチャを設定する。 ここで 、
-
- helplist
- 代替
- baseline ターゲットプラットフォームの最小アーキテクチャ(デフォルト) avx
- ベクトルおよび浮動小数点演算用の SSE命令の代わりにAVX命令を生成する
。
-
- OSX32以外の32ビットメモリモデルでは使用できない
。
-
- nativeuse
- コンパイラが実行されている
- アーキテクチャ
- -mcpu =[h|help|? ] すべての
- アーキテクチャオプションの
- リスト
- -mixin=filename
- filename で指定されたファイルにミックスインを展開して保存する
- -mscrtlib=libname
- Windows をターゲットにしているときに MS-COFF オブジェクトファイル
- をビルドする場合 、
- 指定された C ランタイムライブラリ libname への参照をオブジェクトファイルに埋め込む。main 、 DllMain またはWinMain を指定すると、自動的にリンクされる。デフォルトはlibcmt (リリースバージョンでスタティックリンク)であり、その他の一般的な選択肢は libcmtd 、msvcrt 、msvcrtd である。 Visual Cがインストールされていないことが検出された場合、再配布可能な VC2010ダイナミックランタイムライブラリとmingwベースのプラットフォームインポートライブラリのラッパーが 、LLVMプロジェクトが提供するLLDリンカーを使用して代わりにリンクされる。 msvcrt120 がlibnameとして指定されている場合、この検出は明示的にスキップできる libname libnameが空の場合、C ランタイムライブラリは自動的にリンクされない 。
- -mv=package.module =
- package.module の ソースファイルとしてpath/filenameを使用する 。
- これは、ソースファイルのパスと名前が パッケージおよびモジュール階層と異なる場合に 使用する。path/filename と package.module の 右端のコンポーネントは、同じであれば省略できる 。
- -noboundscheck
- 配列境界のチェックをすべて無効にする。安全な関数に対しても有効である。非推奨 (代わりに-boundscheck=off を使用)。
- -nothrow
- 例外スタック巻き戻しコードの生成を無効にし、 RAII オブジェクト用のより効率的なコードを有効にする。
- -O
- 生成されたコードを最適化する。最速の実行ファイルを作成するには、-O -release -inline -boundscheck=off スイッチを一緒に使用してコンパイルする。
- -o-
- オブジェクトファイルの生成を抑制する。 -D または-H フラグと併用すると便利である 。
- -od=directory
- オブジェクトファイルをカレントディレクトリではなく、objdir ディレクトリに 相対的に書き込む。-op を使用すると、元のパッケージ階層
- を保持できる
- 。
- -of=filename
- 出力ディレクトリ内のファイル名を filename に設定する。 出力ファイルは、 他のスイッチに応じて、オブジェクトファイル、実行可能ファイル、ライブラリファイルのいずれかになる 。
- -op
- 通常、オブジェクト、インターフェース、またはDdocファイル名を生成する際には、.d ソースファイルのパスは削除される 。-op はパスを残す 。
- -os=os
- ターゲットのオペレーティングシステムをホスト以外のものに設定する 。
-
- host:
- ホストのオペレーティングシステム をターゲットとする
- (デフォルト
)。
-
- dragonflybsd: DragonFlyBSD
- freebsd: FreeBSD linux: Linux openbsd: OpenBSD osx: OSX solaris: Solaris windows: Windows
-
- =preprocessorflag
- sppn.exeまたは cl.exe に preprocessorflag を渡す
- -preview=name
- id で識別される今後の言語変更を
- プレビューする
- -preview=[h|help|? ]
- 今後の言語変更を
- すべてリストする
- -profile
-
生成されたコードを調整し、生成されたプログラムが実行された際に、実行時のパフォーマンスデータが収集されるようにする。
生成されたプログラムが完了すると、trace.log とtrace.defというファイルが生成される。trace.log には2つのセクションがあり、
- それぞれプロファイルされた関数の ファンイン
- とファンアウトである。関数の名前は左揃えで表示され、 その直前に表示されるのは、その関数を呼び出す他の関数(ファンイン)と、その関数が呼び出される回数である 。 その直後に続く関数は、呼び出される関数(ファンアウト)と、 その関数が呼び出される回数である。 関数自体には、3つの数値が追加されている。ファンインの合計回数、 関数で使用されるツリー時間(関数時間と、関数が呼び出すすべての関数のツリー時間の合計)、
- ファンアウトで使用された時間を
-
- 除いた時間
- 。
-
- 各関数の タイミングデータは
- 、使用頻度の高い順にソートされている
。
- trace.def ファイルには、密接に関連する関数を関連付けるリンカコマンドが含まれており、 その結果、生成された実行可能ファイルでは隣接して表示される。 詳細については、プロファイルを参照のこと
- -profile =gc
-
- gcGCメモリ割り当てへの呼び出しをインストルメント化し、
プログラム終了時にprofilegc.log にレポートを書き込む。
注釈: インストルメント化された呼び出しのみが
記録される。これには以下が含まれる。
- メモリを割り当てる言語構造
- GCメモリを割り当てる"phobos"関数
- core.memory.GC 経由の GC 割り当て
- gcGCメモリ割り当てへの呼び出しをインストルメント化し、
プログラム終了時にprofilegc.log にレポートを書き込む。
注釈: インストルメント化された呼び出しのみが
記録される。これには以下が含まれる。
- -release
- コンパイルリリース版
- 、つまり、契約およびアサートに対する実行時チェックは行われない。 配列の境界チェックは、 システムおよび信頼された関数に対しては行われず、アサートエラーは 未定義の動作となる 。
- -revert=name
- idで識別された言語の変更を元に戻す
- -revert=[h|help|? ]
- 元に戻せる言語の変更をすべてリストする
- -run
- srcfile
- プログラム srcfileを、 コマンドラインの残りの部分、args...をプログラムの引数として指定する。 .objファイルや実行可能ファイルは残らない。
- -shared
- DLLライブラリを生成する
- -target =triple
- arch はアーキテクチャ: x86 、x64 、x86_64 、または x32のいずれかである 。
- vendor は常に無視されるが、相互運用性を高めるためにサポートされている 。
- os はオペレーティングシステムである。末尾にバージョン番号が付く場合がある 。
- freestanding はオペレーティングシステムなし、 darwin またはosx はMacOS、dragonfly またはdragonflybsd はDragonflyBSD、 freebsd 、openbsd 、linux 、solaris 、またはwindows はそれぞれのオペレーティングシステムである 。
- cenv はC ランタイム環境であり、オプションである。musl-libc の場合はmusl 、 MSVC ランタイムの場合はmsvc (このオプションを指定すると、Windows のデフォルトとなる)、 Android libc の場合はbionic 、Windows 用のDigital Mars ランタイムの場合はdigital_mars GCC C ランタイムの場合はgnu またはglibc 、それぞれの C ランタイムの場合はnewlib またはuclibc ($ I cppenv)は C++ランタイム環境である。LLVM C++ ランタイムの場合はclang 、 gcc 、msvc は Microsoft の MSVC C++ ランタイム(このスイッチを指定した場合は Windows のデフォルト)、 sun は Sun の C++ ランタイム、digital_mars は Windows のDigital Mars C++ ランタイムである 。
- -transition =name
- id で識別された言語変更に関する追加情報を
- 表示する
- -transition=[h|help|? ]
- すべての言語変更
- を表示する
- -unittest
- unittest コードをコンパイルし、アサートを有効にし、 unittest バージョン識別子を設定する
- -v
- 各コンパイラパスの詳細な出力を有効にする
- -vasm
- 各関数で生成されたアセンブリ言語をリストする
- -vcolumns
- 診断結果に
- 文字(列)番号
- を表示する
- -verror-style =[digitalmars|gnu ]
- コンパイラメッセージのファイル/行番号注釈のスタイルを設定する。 ここで 、
-
- digitalmars
- 'file(line[,column]): message'. これがデフォルトである
。
-
- gnu'file:line[:column]: message' 、
- gcc および clang で使用される GNU 標準に準拠する
。
- -verror-supplements=num
- 各エラーに対する補足メッセージの数を
- 制限する
- (0 は無制限を
- 意味する )
- -verrors=num
- エラー/非推奨メッセージの数を制限する (0 は無制限を意味する)
- -verrors =context
- エラーが発生したソースコード行のコンテキストとともにエラーメッセージを表示する
- -verrors =spec
- __traits(compiles,...) のような推測コンパイルからのエラーを表示する
- --version
- コンパイラのバージョンを表示して終了する
- -version=level
- バージョンレベル≧レベル
- で
- コンパイルする
- -version
- =ident
- バージョン識別子identでコンパイルする
- -vgc
- 隠されたものも含めて、すべてのGC割り当てをリストする
- -visibility =value
-
- デフォルト: -shared オプションを指定しない Windows ターゲットでは非表示、それ以外では公開
- hidden: 「export」マークのついたシンボルのみをエクスポートする
- public: すべてのシンボルをエクスポートする
- -vtls
- スレッドローカルストレージに入るすべての変数をリストアップする
- -vtemplates=[list-instances ]
- オプション引数で追加の診断を決定する。
場所:
- list-instances
- 各テンプレートのすべてのインスタンス化コンテキスト
- も表示する
。
- -w
- 警告を有効にする
- -wi
- 情報警告を有効にする(すなわち、 コンパイルは通常通り進行する
- -wo
- 問題となる可能性のある廃止された機能の使用に関する警告を有効にする(コンパイルは 通常通り実行される)
- -X
- JSONファイルの生成
- -Xf
- =filename JSONファイルをfilenameに書き込む
- -Xcc
- =driverflag driverflagをリンカードライバー($CC またはcc )に渡す
dmd -cov -unittest myprog.d
空のスイッチ、すなわち「」は無視される。
ファイル
- \dmd2\src\phobos\
- D ランタイムライブラリのソース
- \dmd2\src\dmd\
- デュアルライセンス(GPLとArtistic)のコンパイラフロントエンドソース
- \dmd2\html\d\
- ドキュメント
- \dmd2\samples\d\
- サンプルDプログラム
- \dmd2\windows\bin\ddemangle.exe
- Dシンボルデマンガー
- \dmd2\windows\bin\dman.exe
- D マニュアル検索ツール
- \dmd2\windows\bin\dmd.exe
- Dコンパイラ実行ファイル
- \dmd2\windows\bin$(DUB)
- Dのパッケージマネージャー
- \dmd2\windows\bin$(DUSTMITE)
- D ソースコードの最小化
- \dmd2\windows\bin$(OPTLINK)
- OPTLINK
- \dmd2\windows\bin$(LINK2 http://www.digitalmars.com/ctg/make.html, make.exe)
- Digitalmars Make
- \dmd2\windows\bin\replace.exe
- ファイル内のテキストを検索/置換
- \dmd2\windows\bin$(RDMD)
- D スクリプトのようなDコード実行用のビルドツール
- \dmd2\windows\bin\sc.ini
- グローバルなコンパイラ設定
- \dmd2\windows\bin$(LINK2 http://www.digitalmars.com/ctg/shell.html, shell.exe)
- シンプルなコマンドラインシェル
- \dmd2\windows\lib$(LIB)
- D ランタイムライブラリ
リンク
リンクは、コンパイルが成功した後、dmd コンパイラによって直接実行される。dmd がリンカーを実行しないようにするには、 -cスイッチを使用する。
32ビットのプログラムは、Dランタイムライブラリphobos.lib とリンクする必要があり、 その後、Digital Mars Cランタイムライブラリsnn.lib とリンクする。 これは、ライブラリのディレクトリがLIB 環境変数のパス上に存在する限り、自動的に実行される。 典型的なLIB の設定方法は以下の通りである。
set LIB=\dmd2\lib;\dm\lib
dmd コマンドをコンパイルとリンクの両方に使用する場合、 Windows実行ファイルのみに有効な特定の最適化が実行される。 その結果生成される.objファイルはDLLで使用しないこと。 exeまたはDLLで使用できる.objファイルにモジュールをコンパイルするには、 -c。 -shared。
32ビットプログラムのリンクは、Digital Mars optlink.exeを使用して行う。
64ビットプログラムのリンクは、 デフォルトではMicrosoftリンカーを使用して行われる。Microsoftリンカーが見つからない場合は、 同梱のLLVMリンカーLLDが使用される。
環境変数
Dコンパイラdmdは、以下の環境変数を使用する。
- DFLAGS
- DFLAGS の値は、dmd.exe へのコマンドラインに追加されたかのように扱われる。
- LIB
- リンカはLIB を使用してライブラリファイルを検索する。Dの場合、 通常は以下のように設定される。
- LINKCMD
- dmd 通常は、 に沿ってPATHoptlink.exe を検索してリンカーを実行する。 32ビットプログラムで特定のリンカーを使用する場合は、 環境変数をそれに設定する。例えば:LINKCMD
- LINKCMD64
- dmd 通常は、 に沿ってPATHoptlink.exe を検索してリンカーを実行する。 代わりに64ビットプログラム用の特定のリンカーを使用するには、 環境変数を設定する。例えば:LINKCMD64
- PATH
- リンカーがdmd.exeと同じディレクトリで見つからない場合、PATH が検索される。 "注釈:"他のリンカーであるlink.exe は動作しない可能性が高い。Digital Mars optlink.exeが PATH で他のlink.exeより先に検索されることを確認するか、LINKCMD を使用して使用するリンカーを
set LIB=\dmd2\lib;\dm\lib
set LINKCMD=\dmd\windows\bin\link
set LINKCMD64=C:\Program Files (x86)\Microsoft Visual Studio 15.0\VC\bin\amd64\link.exe
sc.ini 初期化ファイルは
dmd 初期化ファイル を以下のディレクトリの順序で探す 。 sc.ini
- 現在の作業ディレクトリ
- HOME 環境変数で指定されたディレクトリ
- dmd.exe が存在するディレクトリ
見つかった場合、 ファイル内の環境変数の設定は、既存の設定を上書きする。 これは、dmd を環境変数の使用が競合するプログラムから独立させるのに便利である 。
初期化ファイルのフォーマット
; で始まる行はコメント行であり、無視される。
環境変数は、[Environment] セクションの見出しの後に、 NAME=値のペアで続く。 NAMEは大文字として扱われる。 コメントは、;で始まる行である。 例えば:
; sc.ini file for dmd ; Names enclosed by %% are searched for in the existing environment ; and inserted. The special name %@P% is replaced with the path ; to this file. [Environment] LIB="%@P%..\lib";\dm\lib DFLAGS="-I%@P%..\src\phobos" "-I%@P%..\src\druntime\import" LINKCMD="%@P%....\dm\bin" DDOCFILE=mysettings.ddoc
Location Independence of sc.ini
%@P% はsc.ini へのパスに置き換えられる。 したがって、完全修飾ファイル名sc.ini がc:\dmd2\bin\sc.ini の場合、%@P% はc:\dmd2\bin に置き換えられ、 上記のsc.ini は
[Environment] LIB="c:\dmd2\bin..\lib";\dm\lib DFLAGS="-Ic:\dmd2\bin..\src\phobos" "-Ic:\dmd2\bin..\src\druntime\import" LINKCMD="c:\dmd2\bin....\dm\bin" DDOCFILE=mysettings.ddoc
これにより、dmdの設定を移動しても、sc.ini を再編集する必要がなくなる。
よくあるインストール時の問題
- Cygwinのunzip ユーティリティを使用すると、 奇妙な問題が発生することが知られている。
- Cygwinのコマンドシェルでコンパイラを実行すると、 問題が発生することが知られている。 Cygwinの前に、通常のWindowsシェルcmd.exe で動作するように試してみよう。
- dmd をインストールし、 dmcスペースが含まれるディレクトリパスに インストールすると問題が発生する。
Windows版とLinux版の違い
- 文字列リテラルはLinuxでは読み取り専用である。 それらに書き込みを試みると セグメント違反が発生する。
D インターフェイスファイル
インポート宣言がDソースファイルで処理される場合、 コンパイラはインポートに対応するDソースファイルを検索し、 そのソースファイルを処理して必要な情報を抽出する。 あるいは、コンパイラは代わりに 対応するDインターフェイスファイルを検索することもできる。 Dインターフェイスファイルには、モジュールのインポートに必要なものだけが含まれ
DソースファイルではなくDインターフェースファイルをインポートに使用する利点は、 以下の通りである。
- Dインターフェースファイルは、対応するDソースファイルよりもサイズが大幅に小さく、 処理速度もはるかに速いことが多い。
- ソースコードを隠蔽するために使用することもでき、例えば、 完全なソースコードではなく、Dインターフェースファイルとともにオブジェクトコードライブラリを配布することが可能である。
D インターフェースファイルは、コンパイラに D ソースファイルを指定して、 -Hコンパイラへのスイッチを使用して D インターフェイスファイルは、.di というファイル拡張子を持つ。 コンパイラがインポート宣言を解決する際には、まず .di D インターフェイスファイルを探し、次にDソースファイルを探す 。
Dインターフェイスファイルは、C++のヘッダーファイルと類似した部分がある。 しかし、C++ヘッダーファイルのように必須というわけではなく、 D言語の一部でもない。 Dインターフェイスファイルはコンパイラの機能であり、ビルドプロセスの最適化のみを目的としている。
実行ファイルのビルド
dmd できるだけ多くのソースファイルをコマンドラインに指定すると、実行ファイルをより高速にビルドできる。
複数のソースファイルを同じdmd の呼び出しに置くことのもう一つの利点は、dmd が ある程度のモジュール間の最適化を行えるようになることである。 例えば、モジュール間の関数インライン化などである。
-i フラグを使用すると、インポートされたモジュールを自動的にコンパイルできる
ライブラリの構築
ライブラリをビルドするには3つの方法がある。例えば、 foo.d とbar.d をコンパイルし、既存の オブジェクトファイルabc.obj と既存のライブラリ def.lib を すべてライブラリfoo.lib に結合する。
- モジュールを個別にコンパイルし、その後ライブラリアンを実行する:
dmd -c foo.d dmd -c bar.d phobos.lib -c -p32 foo.lib foo.obj bar.obj abc.obj def.lib del foo.obj bar.obj
このオプションは、makefileを使用してコンパイルを回避する場合に典型的なものである。 すでにコンパイル済みのモジュールをコンパイルしないようにする。 - モジュールをまとめてコンパイルし、その後、ライブラリアンを実行する:
dmd -c foo.d bar.d phobos.lib -c -p32 foo.lib foo.obj bar.obj abc.obj def.lib del foo.obj bar.obj
- dmd を使用して、ライブラリのコンパイルとビルドを1回の操作で実行する:
dmd -lib foo.d bar.d abc.obj def.lib
オブジェクトファイルはディスクに書き込まれず、すべてメモリ内で処理される。 また、 -libまた、モジュールを 1つずつではなく複数のオブジェクトファイルにコンパイルできるという利点もある。 これにより、モジュールを分割することなくライブラリの粒度を向上させることができる。
dmdのコンパイル
コンパイラをビルドするには、完全なソースコードが提供されている。 以下の手順に従う。
cd \dmd2\src\dmd make -f win32.mak
Phobosのコンパイル
DランタイムライブラリであるPhobosをビルドするには、完全なソースコードが提供されている。 以下の手順に従う。
cd \dmd2\src\druntime make -f win32.mak cd ..\phobos make -f win32.mak
DEEPL APIにより翻訳、ところどころ修正。
このページの最新版(英語)
このページの原文(英語)
翻訳時のdmdのバージョン: 2.109.1
ドキュメントのdmdのバージョン: 2.109.1
翻訳日付 :
HTML生成日時:
編集者: dokutoku