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: No Stack & OPTLINK: Warning 134: No Start Address

您可以看到我尝试将chainng main 连接到_main 以摆脱无起始地址错误,但无论如何,没有帮助。我需要做什么来消除这最后两个错误?如果我能让它工作,我想我可以查看我需要实现什么来让更多功能工作。但是,如果有人愿意帮助我解决这个问题,那将不胜感激!

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 回答