英語版
このページの英語版を見る

DMD Compiler for Windows

要件とダウンロード

  1. DMDコンパイラ
  2. Windows オペレーティングシステム、Windows 7 以降、32 ビットまたは 64 ビット
  3. 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: 指定されたチェックは無効である。
=[h|help|? ]
-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: カラー出力は使用しない。
=filename
-conf=filename
ファイル名で指定された 設定ファイルを使用する
-cov
コードカバレッジ解析を行う
-cov=ctfe
CTFE中に実行されたコードをカバレッジレポートに含める
-cov=nnn
コードカバレッジ解析を実行し、.lst ファイルにレポートを生成する。
dmd -cov -unittest myprog.d
-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: すべて
=standard
-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 への参照をオブジェクトファイルに埋め込む。mainDllMain またはWinMain を指定すると、自動的にリンクされる。デフォルトはlibcmt (リリースバージョンでスタティックリンク)であり、その他の一般的な選択肢は libcmtdmsvcrtmsvcrtd である。 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
-P
=preprocessorflag
sppn.exeまたは cl.exe に preprocessorflag を渡す
-preview=name
id で識別される今後の言語変更を
プレビューする
-preview=[h|help|? ]
今後の言語変更を
すべてリストする
-profile
生成されたコードを調整し、生成されたプログラムが実行された際に、実行時のパフォーマンスデータが収集されるようにする。 生成されたプログラムが完了すると、trace.logtrace.defというファイルが生成される。trace.log には2つのセクションがあり、
  1. それぞれプロファイルされた関数の
  2. ファンイン
  3. とファンアウトである。関数の名前は左揃えで表示され、 その直前に表示されるのは、その関数を呼び出す他の関数(ファンイン)と、その関数が呼び出される回数である 。 その直後に続く関数は、呼び出される関数(ファンアウト)と、 その関数が呼び出される回数である。 関数自体には、3つの数値が追加されている。ファンインの合計回数、 関数で使用されるツリー時間(関数時間と、関数が呼び出すすべての関数のツリー時間の合計)、
ファンアウトで使用された時間を
  1. 除いた時間
  1. 各関数の
  2. タイミングデータは
  3. 、使用頻度の高い順にソートされている
trace.def ファイルには、密接に関連する関数を関連付けるリンカコマンドが含まれており、 その結果、生成された実行可能ファイルでは隣接して表示される。 詳細については、プロファイルを参照のこと
-profile =gc
  • gcGCメモリ割り当てへの呼び出しをインストルメント化し、 プログラム終了時にprofilegc.log にレポートを書き込む。 注釈: インストルメント化された呼び出しのみが 記録される。これには以下が含まれる。
    • メモリを割り当てる言語構造
    • GCメモリを割り当てる"phobos"関数
    • core.memory.GC 経由の GC 割り当て
    その他の手段による割り当ては記録されない。 GCのC APIへの直接呼び出しなどである。
-release
コンパイルリリース版
、つまり、契約およびアサートに対する実行時チェックは行われない。 配列の境界チェックは、 システムおよび信頼された関数に対しては行われず、アサートエラーは 未定義の動作となる
-revert=name
idで識別された言語の変更を元に戻す
-revert=[h|help|? ]
元に戻せる言語の変更をすべてリストする
-run
srcfile
プログラム srcfileを、 コマンドラインの残りの部分、args...プログラムの引数として指定する。 .objファイルや実行可能ファイルは残らない。
-shared
DLLライブラリを生成する
-target =triple
arch はアーキテクチャ: x86x64x86_64 、または x32のいずれかである
vendor は常に無視されるが、相互運用性を高めるためにサポートされている
os はオペレーティングシステムである。末尾にバージョン番号が付く場合がある
freestanding はオペレーティングシステムなし、 darwin またはosx はMacOS、dragonfly またはdragonflybsd はDragonflyBSD、 freebsdopenbsdlinuxsolaris 、または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++ ランタイムの場合はclanggccmsvc は 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 )に渡す

空のスイッチ、すなわち「」は無視される。

ファイル

\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の場合、 通常は以下のように設定される。
set LIB=\dmd2\lib;\dm\lib
LINKCMD
dmd 通常は、 に沿ってPATHoptlink.exe を検索してリンカーを実行する。 32ビットプログラムで特定のリンカーを使用する場合は、 環境変数をそれに設定する。例えば:LINKCMD
set LINKCMD=\dmd\windows\bin\link
LINKCMD64
dmd 通常は、 に沿ってPATHoptlink.exe を検索してリンカーを実行する。 代わりに64ビットプログラム用の特定のリンカーを使用するには、 環境変数を設定する。例えば:LINKCMD64
set LINKCMD64=C:\Program Files (x86)\Microsoft Visual Studio 15.0\VC\bin\amd64\link.exe
PATH
リンカーがdmd.exeと同じディレクトリで見つからない場合、PATH が検索される。 "注釈:"他のリンカーであるlink.exe は動作しない可能性が高い。Digital Mars optlink.exeが PATH で他のlink.exeより先に検索されることを確認するか、LINKCMD を使用して使用するリンカーを

sc.ini 初期化ファイルは

dmd 初期化ファイル を以下のディレクトリの順序で探す 。 sc.ini

  1. 現在の作業ディレクトリ
  2. HOME 環境変数で指定されたディレクトリ
  3. 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.inic:\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 を再編集する必要がなくなる。

よくあるインストール時の問題


Windows版とLinux版の違い


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.dbar.d をコンパイルし、既存の オブジェクトファイルabc.obj と既存のライブラリ def.lib を すべてライブラリfoo.lib に結合する。

  1. モジュールを個別にコンパイルし、その後ライブラリアンを実行する:
    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を使用してコンパイルを回避する場合に典型的なものである。 すでにコンパイル済みのモジュールをコンパイルしないようにする。
  2. モジュールをまとめてコンパイルし、その後、ライブラリアンを実行する:
    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
    
  3. 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