Как скомпилировать приложение D без среды выполнения D?

Я пытаюсь понять это навсегда, и это начинает раздражать меня. Я понимаю, что библиотека времени выполнения Д. Что это, что оно делает. Я также понимаю, что вы можете скомпилировать приложение D без него. Нравится то, что XoMB делает. Ну, XoMB определяет свою собственную среду выполнения, но есть случаи, когда вам не нужно писать свои собственные, Если вам это не нужно. Я понимаю, что компилятор DigitalMars D (dmd), который использует im, делает много вещей за кулисами для выполнения, например, эмитирование ссылки на определенные вещи, в зависимости от того, что требуется по программе. А также, вещи для каждой программы. Поэтому вы должны определить их сами. я решил поэкспериментировать, попытаться выяснить это сам и зашел довольно далеко. Под этим я подразумеваю заставить компоновщика выплевывать все меньше и меньше ошибок. Для теста я просто хочу скомпилировать полный bare-bones app, просто чтобы заставить вещи работать без выполнения. Или как можно меньше времени выполнения. вот что у меня есть мой единственный источник файл.

module main;

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

я компилирую с: dmd-c main.д -по умолчанию=

затем ссылка с: link main.параметр obj

и это ошибки, которые я получаю : OPTLINK: Warning 23: No Stack & OPTLINK: Warning 134: No Start Address

вы можете видеть, что я попробовал chaingng main to _main, чтобы избавиться от ошибки без начального адреса, но, в любом случае, это не помогло. Что мне нужно сделать, чтобы сгладить эти две последние ошибки? если я смогу заставить его работать, я думаю, что смогу найти то, что мне нужно реализовать получите больше функций. Но если кто-то готов помочь мне в этом, это было бы очень оценено!

2 ответов


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

ldc -nodefaultlib -noruntime

у меня был успех с этим. Но вы все равно захотите добавить:

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

обратите внимание, что, хотя среда выполнения является необязательной, она требуется для многих функций. Вам будет не хватать нарезки массива, (динамические массивы?), GC и многие другие. Если вы случайно используете одну из этих функций, вы получите множество предупреждений о том, как она не может найти какое-то неясное имя символа.