如何在没有D运行时编译D应用程序?

时间:2012-11-26 21:16:08

标签: d dmd druntime

我一直在努力想象这个,并开始惹恼我。我理解D运行时库。它是什么,它做了什么。我也明白你可以在没有它的情况下编译D app。就像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:无起始地址

你可以看到我试过chaingng main来_main来摆脱no start address错误但是, 无论如何,没有帮助。我需要做些什么来解决这两个最后的错误?如果我可以让它工作,我想我可以查找我需要实现什么来获得更多的功能。但如果有人愿意帮我解决这个问题,那就太过分了!

2 个答案:

答案 0 :(得分:7)

module main;
extern(C) __gshared void* _Dmodule_ref;
extern(C) int main() {
    int a = 2 + 3;
    return 0;
}

答案 1 :(得分:2)

ldc -nodefaultlib -noruntime

我已经取得了成功。但你仍然想要添加:

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

请注意,虽然运行时是可选的,但很多功能都需要它。你会缺少数组切片,(动态数组?),GC和其他很多。如果你不小心使用其中一个功能,你会收到很多警告,告诉它如何找不到一些不起眼的符号名称。