我正在尝试构建一个项目,在windows中使用dmd编译器本身(不带ide)。我发现自己几乎无法意识到一些关于联系的时刻。通常IDE会为我做这些。
我的项目结构

project
├──bin
|   ├──exemple.obj
|   └──exemple.exe
└──src
    ├──a
    |  └──b.d
    └──exemple.d

D
import a.b;
void  main() { B obg = new B(); }

B.D
module a.b;
class B {
    private int i;
    public this() {i=0;}
    public void act() {i++;}
}

起初,用命令似乎很容易构建:
cd C:\path\to\my\project
dmd bin\exemple.exe src\exemple.d -IC:\path\to\my\project\src

但它只显示了一些错误信息:
OPTLINK (R) for Win32  Release 8.00.13
Copyright (C) Digital Mars 1989-2010  All rights reserved.
http://www.digitalmars.com/ctg/optlink.html
bin\exemple.obj(exemple)
 Error 42: Symbol Undefined _D1a1b1B7__ClassZ
bin\exemple.obj(exemple)
 Error 42: Symbol Undefined _D1a1b1B6__ctorMFZC1a1b1B
--- errorlevel 2

最后我猜obj文件不见了。我用命令手动完成的:
cd bin
dmd ..\src\a\b.d -c
cd ..

并手动将其添加到我的生成命令中:
dmd bin\exemple.exe src\exemple.d -IC:\path\to\my\project\src bin\b.obj

现在它开始工作了。
伟大的。但是如果我们有很多额外的d文件和复杂的文件夹结构呢?
怎么可能是原子化的?
当我发现DMD并不是自动完成这一切时,我非常惊讶。也许,我只是做错了。

最佳答案

您不必单独构建A/B.D。但您必须将所有源(或对象)文件传递给dmd。DMD没有找出依赖关系。
看看rdmd。这是一个工具,它可以找出依赖关系,然后对所有依赖关系运行dmd(然后默认运行可执行文件,--build-only会阻止这种情况)。它与DMD版本一起提供。

10-06 06:52