7

私はこれを永遠に理解しようとしてきました、そしてそれは私を悩ませ始めています. D ランタイム ライブラリを理解しています。それが何であるか、それが何をするか。また、それなしで D アプリをコンパイルできることも理解しています。XoMBのように。XoMB には独自のランタイムが定義されていますが、必要がなければ独自のランタイムを作成する必要がない場合もあります。私が使用している DigitalMars D コンパイラ (dmd) は、プログラムで必要なものに応じて特定のものへの参照を発行するなど、ランタイムの舞台裏で多くのことを行うことを理解しています。そしてまた、すべてのプログラムのためのもの。したがって、これらを自分で定義する必要があります。私は実験することに決めました。つまり、リンカーが吐き出すエラーがどんどん少なくなるということです。テストのために、完全な必要最小限のアプリをコンパイルしたいだけです。ランタイムなしで物事を機能させるだけです。または実行時間をできるだけ少なくします。これが私の単一のソースファイルです。

module main;

void _main()
{
    int a = 2 + 3;
}

私は次のようにコンパイルします: dmd -c main.d -defaultlib=

次にリンクします: link main.obj

そして、これは私が得るエラーです: OPTLINK: 警告 23: スタックがありません & OPTLINK: 警告 134: 開始アドレスがありません

開始アドレスなしエラーを取り除くために main を _main にチェーンしようとしたことがわかりますが、とにかく役に立ちませんでした。これらの最後の 2 つのエラーを解決するにはどうすればよいですか? もし私がそれを機能させることができれば、より多くの機能を機能させるために実装する必要があるものを調べることができると思います. しかし、誰かが私を助けてくれるなら、それは非常にありがたいです!

4

2 に答える 2

8
module main;
extern(C) __gshared void* _Dmodule_ref;
extern(C) int main() {
    int a = 2 + 3;
    return 0;
}
于 2012-11-26T21:31:36.287 に答える
3
ldc -nodefaultlib -noruntime

私はそれで成功しました。しかし、あなたはまだ追加したいでしょう:

extern(C) __gshared void* _Dmodule_ref;
extern(C) int main() {}

ランタイムはオプションですが、多くの機能で必須であることに注意してください。配列のスライス (動的配列?)、GC、およびその他の機能が不足しています。これらの機能のいずれかを誤って使用すると、あいまいなシンボル名が見つからないという多くの警告が表示されます。

于 2012-11-26T22:19:46.937 に答える