D язык программирования: модуль stdio не может читать файл std\stdio.d

Я установил dmd (2.0?) с помощью установщика Windows и пытаюсь скомпилировать следующую программу:

module tcpechoserver;

import std.stdio;

const int MAXPENDING = 5;

int main(char[][] argv)
{
    if(argv.length != 2){
        writef("Usage: %s <port>", argv[0]);
    }

    return 0;
}   

Но я получаю следующую ошибку компилятора:

Error: module stdio cannot read file 'std\stdio.d'

Есть ли какие-то пути, которые я должен указать, чтобы заставить стандартную библиотеку работать?

Ответ 1

Посмотрите файл ~\windows\bin\sc.ini в каталоге установки dmd. Он содержит неявные аргументы командной строки для dmd, которые должны выглядеть так: dmd 2.048:

LIB="%@P%\..\lib";\dm\lib

и

DFLAGS="-I%@P%\..\..\src\phobos" "-I%@P%\..\..\src\druntime\import"

Если они в порядке, и это не работает, возможно, ваша установка будет нарушена. Я рекомендую вам просто загрузить сжатую версию компилятора и распаковать ее поверх вашей установки.

Ответ 2

Когда вы получаете такие ошибки, это означает, что DMD не может найти файл импорта. Если вы import foo.bar.xyz, то он ожидает, что он найдет xyz.d в некотором каталоге foo\bar\.

Он ищет этот каталог во всех стандартных путях импорта, а также в текущем каталоге (например, если вы добавили каталог std рядом с вашим tcpechoserver.d с stdio.d в нем, то он будет используйте это). Конечно, вы этого не хотите - вам нужен стандартный stdio.d.

Вы можете найти, какие каталоги он ищет, открыв файл

C:\D\dmd2\windows\bin\sc.ini (при условии, что вы установили его в каталог по умолчанию).

Внутри этого файла должна содержаться строка:

DFLAGS="-I%@P%\..\..\src\phobos" "-I%@P%\..\..\src\druntime\import"

который говорит компилятору, чтобы искать эти пути при поиске каталогов импорта. Если у вас нет этой строки по какой-либо причине (или если строка отличается), попробуйте добавить эту строку в sc.ini (в любом месте под заголовком [Environment]).

Также убедитесь, что каталог dmd2 содержит файл \src\phobos\std\stdio.d.

Если оба они не работают, я рекомендую переустановку с нуля.