DMD Compiler for Linux
- 要件とダウンロード
- インストール
- コンパイラ引数とスイッチ
- ファイル
- リンク
- 環境変数
- dmd.conf初期化ファイル
- Windows版とLinux版の違い
- D インターフェースファイル
- ライブラリの構築
- dmdのコンパイル
- Phobosのコンパイル
要件とダウンロード
- DMDコンパイラ
- 32ビットx86および64ビットx86-64のLinuxオペレーティングシステム (LDC およびGDCは、 さらに多くのアーキテクチャをサポートしている )
- GNU C コンパイラ(gcc)または LLVM C コンパイラ(clang)
インストール
ヒント - 公式パッケージでは これらの手順が自動的に実行される。 あるいは、インストールスクリプトを使用して、ユーザーディレクトリにDMDをインストールすることもできる。 アーカイブをホームディレクトリに解凍する。 これにより、~/dmd ディレクトリが作成され、すべてのファイルが格納される。 すべてのツールはコマンドラインツールであり、 コンソールウィンドウから実行される。 すべてのツールはアーカイブから直接実行できる。~/dmd/linux/bin64/dmddmd をグローバルにインストールするには、~/dmd/linux/bin64 フォルダをPATH に追加する。
export PATH="$HOME/dmd/linux/bin64:$PATH"または、以下のようにして、dmd をローカルにインストールすることもできる。
- /etc/dmd.conf で構成ファイルを作成する:
[Environment64] DFLAGS=-I/usr/local/include/d/dmd -L-L/usr/local/lib -L--export-dynamic -fPIC
- バイナリを/usr/local/bin にコピーする:
sudo cp dmd2/linux/bin64/{dmd,dumpobj,obj2asm,rdmd,ddemangle,dub,dustmite} /usr/local/bin
ライブラリをxml-ph-0000@deepl.internalにコピーする: xml-ph-0001@deepl.internal - ライブラリを/usr/local/lib にコピーする:
sudo cp dmd2/linux/lib64/libphobos2.a /usr/local/lib
- 標準ライブラリとランタイムのソースを/usr/include/d/dmd にコピーする:
sudo mkdir -p /usr/include/d/dmd sudo cp dmd2/{phobos/std,phobos/etc,druntime/import} /usr/include/d/dmd
コンパイラ引数とスイッチ
- dmd ファイル...-スイッチ...
- ファイル...
-
ファイル拡張子 拡張子 ファイルの種類 なし Dソースファイル .c Cソースファイル .d Dソースファイル .dd Ddocソースファイル .di D インターフェースファイル .i プリプロセスされたCソースファイル .o リンクするオブジェクトファイル .a 検索するオブジェクトコードライブラリ - @cmdfile
- cmdfileが環境変数である場合、 コンパイラの引数とスイッチをその変数の値から読み取る。 そうでない場合は、コンパイラの引数とスイッチを テキストファイルcmdfile から読み取る。 このファイルには、ハッシュ記号で始まる1行のコメントが含まれている場合がある (# )。
- -allinst
- すべてのテンプレート実装用のコードを生成する
- -betterC
-
コンパイラを調整して、Dをより優れたCとして実装する:
- D_BetterC バージョンを事前定義する。
- 式が失敗した場合、 Dランタイム内の関数ではなく、Cランタイムライブラリのassert失敗関数を呼び出す。
- 配列のオーバーフローは、 Dランタイムの関数ではなく、Cランタイムライブラリのassert失敗関数を呼び出す。
- 最終的なスイッチエラーは、 Dランタイムの関数ではなく、Cランタイムライブラリのエラー関数を呼び出す。
- phobosランタイムライブラリと自動的にリンクしない。
- 完全なアンワインディング情報を持つDwarfeh_frame を生成しない。つまり、例外テーブルはeh_frame に挿入されない。
- モジュールのコンストラクタとデストラクタが生成されないため、 静的および 共有静的コンストラクタと デストラクタは 呼び出されない。
- 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をリンクする。libphobos2.a の代わりに使用する。 libnameが指定されていない場合は、デフォルトライブラリはリンクされない。
- -defaultlib=name
- シンボリックデバッグ用にコンパイルしていない場合、libphobos2.a の代わりにデフォルトライブラリとして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
- DWARF形式のシンボリックデバッグ情報を追加 デバッガ用 gdb
- -gdwarf=version
- 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
- リンカーにリンカーフラグを渡す。 例えば、ld
- -lib
- オブジェクトファイルではなくライブラリファイルを出力として生成する。 コンパイルされたすべてのソースファイル、およびコマンドラインで指定されたオブジェクトファイルとライブラリ ファイルは、出力ライブラリに挿入される。 コンパイルされたソースモジュールは、粒度を向上させるために複数のオブジェクトモジュールに分割される場合がある 。 ライブラリ名は、最初にコンパイルされたソースモジュール名から取得される。この名前は、 スイッチで -of。
- -lowmem
- コンパイラのガベージコレクタを有効にすると、 コンパイラのメモリ要件は減少するが、コンパイル時間は増加する。
- -m32
- 32ビットの実行ファイルをコンパイルする。これは32ビットのdmdのデフォルトである。
- -m64
- 64ビットの実行ファイルをコンパイルする。これは64ビットのdmdのデフォルトである。
- -main
- コンパイル時にデフォルトのmain() 関数を追加する。これは、 ライブラリの単体テストを行う際に有用である。 手動でエントリーポイント関数を定義することなく、ライブラリ内の単体テストを実行できる 。
- -makedeps[=filename
- Makefile互換形式で依存関係を表示する。 filenameが省略された場合は、stdoutに出力される。 出力されるターゲットは、コンパイルされた成果物(実行ファイル、オブジェクトファイル、ライブラリ)である 。
- 出力される依存関係は、インポートされたモジュールとインポートされた文字列ファイル(-J スイッチ経由)である。 依存関係またはターゲットのファイル名に特殊文字が含まれる場合は、GNU Make の方式に従ってエスケープされる。
- -man
- このページでBROWSER環境変数で指定されたブラウザを開く。BROWSER が 未定義の場合、x-www-browser が想定される。
- -map
- .map ファイルを生成する
- -mcpu=id
- コード生成のターゲットアーキテクチャを設定する。 ここで 、
-
- helplist alternatives baselinethe
- ターゲットプラットフォームの
- 最小
- アーキテクチャ(デフォルト)
- avx
- ベクトルおよび浮動小数点演算用の SSE命令の代わりにAVX命令を 生成する
。
-
- OSX32以外の32ビットメモリモデルでは使用できない
。
-
- nativeuse
- コンパイラが実行されている
- アーキテクチャ
- -mcpu=[h|help|? ] すべての
- アーキテクチャオプション
- を表示
- -mixin=filename
- ミックスインを
- filename
- で指定したファイルに展開して保存する
- -mv
- =package.module=
- path/filenameを package.module のソースファイルとして使用する 。
- これは、ソースファイルのパスと名前が パッケージおよびモジュール階層と同じでない場合に使用する 。
- 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 プリプロセッサフラグを cpp
- -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...をプログラムの引数として指定する。 .oファイルや実行可能ファイルは残らない。
- -shared
- 共有ライブラリを生成する
- -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/
- D コンパイラフロントエンドのソースコード(GPLとArtisticのデュアルライセンス)
- dmd2/html/d/
- ドキュメント
- dmd2/samples/d/
- サンプルDプログラム
- dmd2/linux/bin/ddemangle
- D シンボルデマンジャー
- dmd2/linux/bin/dman
- D マニュアル検索ツール
- dmd2/linux/bin/dmd
- Dコンパイラ実行ファイル
- dmd2/linux/bin/dmd.conf
- グローバルコンパイラ設定(/etc/dmd.conf にコピー )
- dmd2/linux/bin/dub
- Dのパッケージマネージャー
- dmd2/linux/bin/dumpobj
- ELFファイルダンプツール
- dmd2/linux/bin/dustmite
- D ソースコードの最小化ツール
- dmd2/linux/bin/obj2asm
- ELFファイル逆アセンブラ
- dmd2/linux/bin/rdmd
- D ビルドツール(スクリプトのようなDコード実行用 )
- dmd2/linux/lib/libphobos2.a
- D ランタイムライブラリ(/usr/lib/libphobos2.a にコピー )
リンク
リンキングは、コンパイルが成功した後、dmd コンパイラによって直接実行される。dmd がリンカーを実行しないようにするには、 -cスイッチを使用する。
実際のリンクは、gcc を実行することで行われる。 これにより、gcc でコンパイルされたモジュールとの互換性が確保される。
環境変数
Dコンパイラdmdは、以下の環境変数を使用する。
通常は、xml-ph-0000@deepl.internal を xml-ph-0001@deepl.internal に沿って探し、リンカーを実行する。特定のリンカーを使用する場合は、設定する。- CC
- dmd 通常は、PATH に沿ってgccを探し、リンカを実行する。 特定のリンカを使用する場合は、 CC 環境変数をその値に設定する。例えば:
- BROWSER
- これは、マニュアルページを開く際に使用するブラウザを -man スイッチとともに設定する。デフォルトはx-www-browser である 。
- DFLAGS
- DFLAGS の値は、dmd へのコマンドラインに追加されたかのように扱われる。
set CC=gcc
dmd.conf 初期化ファイル
dmdファイルdmd.conf は、Windows用のsc.iniと同じである。 ただ、ファイル名が異なるだけだ。 これにより、Windowsとこのシステムの両方に共通する設定を、 ファイルを再編集することなく作成できる。
dmd 初期化ファイル を以下のディレクトリの順序で探す :dmd.conf
- 現在の作業ディレクトリ
- HOME 環境変数で指定されたディレクトリ
- HOME 環境変数で指定されたディレクトリ内の.dmd.conf
- dmd が存在するディレクトリ
- /etc/
見つかった場合、 ファイル内の環境変数の設定が既存の設定を上書きする。 これは、dmd を環境変数の使用が競合するプログラムから独立させるのに便利である。
環境変数は、xml-ph-0000@deepl.internalセクションの見出しに続き、 NAME=valueの形式で記載する。 NAMEは大文字として扱われる。 コメントは、;で始まる行である。環境変数は、[Environment] セクションの見出しに続き、 NAME=値のペアで記載する。 NAMEは大文字として扱われる。 コメントは、;で始まる行である。 例:
; dmd.conf 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] DFLAGS=-I%@P%/../src/phobos -I%@P%/../src/druntime/import
Windows版とLinux版の違い
- Linuxでは文字列リテラルは読み取り専用である。 それらに書き込みを試みると セグメント違反が発生する。
D インターフェースファイル
Dソースファイルでインポート宣言が処理されると、 コンパイラはインポートに対応するDソースファイルを検索し、 そのソースファイルを処理して必要な情報を抽出する。 あるいは、コンパイラはDソースファイルでインポート宣言が処理されると、 コンパイラはインポートに対応するDソースファイルを検索し、 そのソースファイルを処理して必要な情報を抽出する。 あるいは、コンパイラは代わりに 対応するDインターフェイスファイルを検索することもできる。 Dインターフェイスファイルには、 モジュールのインポートに必要なものだけが含まれ、 そのモジュールの実装全体ではなく、
DソースファイルではなくDインターフェイスファイルをインポートに使用する利点は、 以下の通りである。
- Dインターフェースファイルは、対応するDソースファイルよりもサイズが大幅に小さく、 処理速度も速いことが多い。
- ソースコードを隠蔽するために使用することも可能であり、例えば、 Dインターフェースファイルとともにオブジェクトコードライブラリを配布する ことも、完全なソースコードを配布するよりも容易である。
D インターフェースファイルは、コンパイラに D ソースファイルを指定することで作成できる。 -Hコンパイラへのスイッチを使用して D インターフェースファイルを作成することができる。 D インターフェースファイルの拡張子は.di である。 コンパイラがインポート宣言を解決する際には、まず .di D インターフェースファイルを探し、次に D ソースファイルを探す 。
Dインターフェイスファイルは、C++ヘッダーファイルと類似した部分がある。 しかし、C++ヘッダーファイルのように必須というわけではなく、 D言語の一部でもない。 Dインターフェイスファイルはコンパイラの機能であり、ビルドプロセスの最適化のみを目的としている。
実行ファイルのビルド
dmd できるだけ多くのソースファイルをコマンドラインに指定すると、実行ファイルをより高速にビルドできる。
また、複数のソースファイルを同じxml-ph-0000@deepl.internalの呼び出しに置くことのもう一つの利点は、xml-ph-0001@deepl.internalがいくつかのレベルで実行できることである。同じdmd の呼び出しに複数のソースファイルを置くことのもう一つの利点は、dmd が ある程度のモジュール間の最適化を行うことができることである。 例えば、モジュール間の関数インライン化などである。
-i フラグを使用すると、インポートされたモジュールを自動的にコンパイルすることができる
ライブラリの構築
ライブラリを構築するには3つの方法がある。例えば、foo.d とbar.d をコンパイルし、 オブジェクトファイルabc.o と既存のライブラリdef.a を すべてライブラリfoo.a に結合する。
- モジュールを個別にコンパイルし、その後ライブラリアンを実行する:
dmd -c foo.d dmd -c bar.d rm -f foo.a ar -r foo.a foo.o bar.o abc.o def.a rm foo.o bar.o
このオプションは、すでにコンパイル済みのモジュールをコンパイルしないようにするために、makefileを使用する場合に典型的なものである。 - モジュールをまとめてコンパイルし、その後、ライブラリアンを実行する:
dmd -c foo.d bar.d rm -f foo.a ar -r foo.a foo.o bar.o abc.o def.a rm foo.o bar.o
- dmd を使用して、ライブラリのコンパイルとビルドを1回の操作で実行する:
dmd -lib foo.d bar.d abc.o def.a
オブジェクトファイルはディスクに書き込まれず、すべてメモリ内で処理される。 また、 -libまた、モジュールを 1つずつではなく、複数のオブジェクトファイルにコンパイルできるという利点もある。 これにより、モジュールを分割することなくライブラリの粒度を向上させることができる。
dmdのコンパイル
コンパイラをビルドするには、完全なソースコードが提供されている。 以下の手順に従う。
cd ~/dmd2/src/dmd make -f posix.mak
Phobosのコンパイル
DランタイムライブラリであるPhobosをビルドするための完全なソースコードが提供されている。 以下の手順に従う。
cd ../phobos make -f posix.mak
DEEPL APIにより翻訳、ところどころ修正。
このページの最新版(英語)
このページの原文(英語)
翻訳時のdmdのバージョン: 2.109.1
ドキュメントのdmdのバージョン: 2.109.1
翻訳日付 :
HTML生成日時:
編集者: dokutoku