我一直在努力想象这个,并开始惹恼我。我理解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错误但是, 无论如何,没有帮助。我需要做些什么来解决这两个最后的错误?如果我可以让它工作,我想我可以查找我需要实现什么来获得更多的功能。但如果有人愿意帮我解决这个问题,那就太过分了!
答案 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和其他很多。如果你不小心使用其中一个功能,你会收到很多警告,告诉它如何找不到一些不起眼的符号名称。