Command line 为什么不';其他模块是否正在编译?

Command line 为什么不';其他模块是否正在编译?,command-line,module,compilation,d,dmd,Command Line,Module,Compilation,D,Dmd,我有两个文件:Main.d和ImportMe.d。它们的目的应该是不言自明的。它们位于同一目录中,并且没有显式的模块声明。然而,当我试图编译Main.d时,我得到了一个“symbols not found”错误 同时编译这两个文件效果很好 $ dmd Main.d ImportMe.d 不过,您不必对标准库执行此操作。它有什么不同之处?通过-I更改包含路径没有明显效果。您不必从标准库中指定模块,因为编译器会隐式地将预编译的标准库.lib文件传递给链接器。对于您自己的项目,考虑使用或另一个构建工

我有两个文件:
Main.d
ImportMe.d
。它们的目的应该是不言自明的。它们位于同一目录中,并且没有显式的模块声明。然而,当我试图编译
Main.d
时,我得到了一个“symbols not found”错误

同时编译这两个文件效果很好

$ dmd Main.d ImportMe.d

不过,您不必对标准库执行此操作。它有什么不同之处?通过
-I
更改包含路径没有明显效果。

您不必从标准库中指定模块,因为编译器会隐式地将预编译的标准库.lib文件传递给链接器。对于您自己的项目,考虑使用或另一个构建工具。

编译模块时,DMD必须具有该模块在其导入路径中需要的所有模块的.d或.di文件。code>-I允许您将路径添加到导入路径。但是,这并没有构建其他模块。它只提供dmd构建您请求它构建的模块所需的内容。当您链接时,dmd需要程序中使用的所有模块的对象文件或库二进制文件,否则它会抱怨未定义的符号(

-L
可用于链接器标志,如果您想在库中链接)。链接步骤使用C链接器,因此它根本不了解D,也不了解任何模块

因此,如果在两个步骤中编译和链接,首先分别编译每个模块或与其他模块一起编译,生成对象文件或库文件,具体取决于传递给编译器的标志(对象文件是默认的)。然后在链接阶段将这些对象文件和库链接在一起,生成可执行文件

当您使用dmd而不传递它
-c
-lib
时,它将同时进行编译和链接,因此您必须向它提供您想要编译的所有模块,或者当它到达链接步骤时,它将抱怨未定义的符号。它不会神奇地编译您要求它编译导入的所有模块。如果您想要这种行为,您需要使用rdmd之类的工具


由于dmd.conf(在Posix上)或sc.ini(在Windows上),dmd能够找到druntime和Phobos,而无需指定它们。该配置文件将适当的.d和.di文件添加到导入路径,并将libphobos.a或phobos.lib(取决于平台)添加到
DFLAGS
,以便dmd在编译模块时可以找到这些模块,并在链接阶段链接到库中。它还添加了标准库需要使用的任何其他标志(例如Linux上librt中的链接)。如果您将这些文件中的任何一个移动到非标准位置,则需要更改该配置文件,以便dmd仍能找到它们。

编译器是否也必须隐式传递接口文件?我不认为它可以挖掘库并找到模块,不是吗?
$ dmd Main.d ImportMe.d