8

我正在尝试在 D(语言版本 2)中使用基本模块导入。作为指导,我在 dlang.org 上使用了示例,但我的简单程序无法编译。这些文件位于同一目录中。

这是我的 main.d 文件的内容:

import std.stdio;
import mymodule;

void main(string[] args){
  sayHello();
  writeln("Executing Main");
}

这是我的模块文件的内容(mymodule.d):

void sayHello(){
  writeln("hello");

}

要编译,我通过 bash 执行:

dmd main.d

错误输出是:

main.o: In function `_Dmain':
main.d:(.text._Dmain+0x5): undefined reference to `_D8mymodule8sayHelloFZv'
collect2: ld returned 1 exit status
--- errorlevel 1
4

2 回答 2

11
  1. 您需要在命令行上列出您正在编译的所有模块。如果你不列出一个模块,那么它就不会被编译。编译的模块将能够使用未编译的模块,因为编译器会引入它们的声明,但编译器不会为它们生成目标文件。因此,当链接器转到链接时,它会抱怨缺少定义。在这种情况下,它抱怨mymodule.sayHello尚未定义的事实。

    如果您希望编译器自动搜索第一个模块导入的所有模块并为您全部编译,那么您将需要使用 rdmd,它是 dmd 的包装器,它是 dmd 附带的。dmd 本身并不这样做。它只编译你告诉它的模块。

  2. 你还没有std.stdio在 mymodule 中导入。所以,即使你dmd main.d mymodule.d喜欢你应该的(甚至更好,dmd -w main.d mymodule.dor dmd -wi main.d mymodule.d),它也将无法编译 mymodule,因为writeln尚未声明。main.d 导入它的事实对 mymodule 没有影响。

  3. 虽然在这种情况下这没什么大不了的,但您确实应该module modulename;在模块的顶部放置一个声明。编译器会根据文件名推断模块名称,但是一旦有了子包,就需要这样做,否则会遇到导入问题,因为只推断出文件名,而不是包名。所以,如果你有foo/bar/mod.d,而你没有在 中module声明mod.d,它将被推断为mod,而不是foo.bar.mod

于 2012-06-20T17:34:30.693 回答
5

dmd mymodule.d main.d

我所知道的能够独立解决依赖关系的唯一语言是 Go 和 Haskell。

于 2012-06-20T17:47:18.393 回答