кто разобрался с написанием модулей на Ди? напишите please какая у вас OS. у меня сейчас Ubuntu 7.10 стоит DMD 2 последний кроме библиотечных модулей ничего не загружает
Решение проблемы зависит от того, что ещё вы пытаетесь загрузить. С ключами компилятора я особо не разбирался, т.к. использую DSSS, но, вроде, достаточно указать пути к исходникам используемых модулей (ключ -I )и перечислить относительные пути к компилируемым файлам.
Kubuntu 8.04. DMD 2.012 без DSSS и GDC 0.24 с DSSS - всё работает.
M$ Windows XP SP1. DMD 1.010 с DSSS - последний раз смотрел - работало.
> я в этом ещё юзер
Ясно.
В файле с исходником после module пишется его полное имя (пусть будет A). Если модуль A должен использоваться из модуля B,
то в исходнике с модулем B нужно написать import A. И всё.
dmd передаётся список исходников и он из них делает объектные файлы и линкует в исполняемый файл. Если передать ключ -c,
то исполняемый файл создан не будет. При компиляции имя модуля остаётся в объектном файле. Объектный файл можно давать
компилятору так же, как и исходники и он будет прилинкован. Например:
//Файл A.d
module A;
import B;
void main() {
foo();
}
//Файл B.d
module B;
import std.io;
void foo() {
writefln("Called Foo!");
}
Можно скомпилировать так:
$ dmd A.d B.d
Можно так:
$ dmd -c B.d
$ dmd A.d B.o
Или даже так:
$ dmd -c A.d B.d
$ dmd A.o B.o
А можно установить dsss, создать dsss.conf с одной строчкой:
[A.d]
и скомпилировать с автоопределением зависимостей:
$ dsss build
Если B.d был написан и скомпилирован в либу до нас и исходников у нас нет, то нужно делать так:
$ dmd A.d B.di -L-lB.a
Нужно перечислить *.di для всех interface файлов и не забыть прилинковать соответствующую либу ключом -L-l[имя_либы]
Или, если либа была установлена через dsss:
$ dsss build
С тем же dsss.conf, что и в предыдущем примере.
И вообще RTFM ;) :
http://digitalmars.com/d/2.0/lex.htmlhttp://dsource.org/projects/dsss
DSSS чаще сравнивают с CPAN и Gems. Это система для установки софта из исходников со всеми зависимостями из центрального репозитория. Для разработчика DSSS - система для автоматизированного билда. Я использую его для всех своих проектов. Обычно dsss.conf выглядит так:
-----------------------------------------------
name = my_project
[mycompany/myproduct/mylib]
target = mylib
[mycompany/myproduct/anotherlib]
target = anotherlib
[mycompany/myproduct/myapp/main.d]
target = myapp
-----------------------------------------------
С зависимостями, incremental build'ами, прилинковываемыми библиотеками, различиями между компиляторами и платформами он разбирается сам.
make менее удобен для проектов размером больше одного файла хотя бы тем, что в makefile'ах все зависимости ручками прописывать надо. Зачем, если они есть в исходниках?
Не судите строго, если где незаслуженно опустил make. Последний раз писал makefile чуть больше 4-х лет назад.
> в makefile'ах все зависимости ручками прописывать надо. Зачем, если они есть в исходниках?
Не надо, пишем
program: main.d lib.d another.d
dmd -of$@ $^
:)
Не тру, но dmd компилит весьма шустро, и на *небольших* проектах не заметно. Линкер работает дольше :)
Спасибо за ответ, всё понятно.
> dmd компилит весьма шустро, и на *небольших* проектах не заметно.
Проблемы начнутся, если проект *большой*. Размером скажем с DWT. :) И, прошу заметить, что в моём примере mylib, anotherlib и myapp вполне могут состоять из пары сотен файлов с исходниками, зависящими от библиотек сторонних производителей.
> Линкер работает дольше :)
Чтобы линкер работал быстрее, чем dmd, используйте optlink. Правда он понимает только OMF.
После релиза binutils с gold можно попробовать поэкспериментировать с ним.
Мне make нравится тем, что он простой как 2 рубля, в нём можно делать почти всё что угодно (потому что он, фактически, является интерпретатором декларативного ЯП), и я его знаю. Со сложными специализированными системами сборки зачастую бывает сложно делать простые вещи (это обобщённое утверждение, не обязательно про dsss).
Вообще мне сейчас нужны такие вещи: трансляция .apd файла используя apaged (и последующая его компиляция); сборка двух бинарников - 1 для прогона юниттестов, с отладочными опциями, второй после успешного запуска первого, с оптимизационными опциями. Ещё я не люблю, когда всё собирается в каталоге с исходниками, т.е. желательна возможность сборки в отдельном каталоге. Насколько это укладывается в схему dsss? Если это в нём несложно сделать, то перееду на него :)
> Чтобы линкер работал быстрее, чем dmd, используйте optlink. Правда он понимает только OMF.
Спасибо, посмотрю. Пока у меня объектные файлы только D-шные.
Можно сделать например так:
$ cat main.d
import tango.io.Console;
void main() {
Cout("Hello!\n");
}
unittest {
Cout("unittest\n");
}
$ cat dsss.conf
name = test
[main.d]
target = main
prebuild = ./makeApd.sh #Здесь транслируем apd
debugflags = -unittest -debug
releaseflags = -O -inline -release
$ cat make.sh
dsss clean
dsss build main --debug
./main
dsss clean
dsss build main
./main
$ ./make.sh
main.d => main
[команды]
unittest
Hello!
main.d => main
[команды]
Hello!
Обьектные файлы по умолчанию отправляются в каталог dsss_objs. Недостатки очевидны. Повсеместное использование
shell скриптов и (пока) невозможность сделать один target зависящим от другого. Можно только указать соответствующий
dsss build [зависимость] в prebuild скрипте зависимой цели. Преимущества я описал ранее.
Но если makefile уже есть и работает, думаю не стоит переписывать его на dsss.
> Пока у меня объектные файлы только D-шные.
optlink запускается только под оффтопик, принимает на вход только OMF (не обязательно скомпиленные dmd, можно, например, и очень
старыми MSVC) и выдаёт только PE. Для Линукса бесполезен... Зато быстрее, чем ld в 50-100 раз. :/