我正在尝试在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
答案 0 :(得分:10)
您需要列出您在命令行上编译的所有模块。如果您没有列出模块,那么它将不会被编译。 编译的模块将能够使用未编译的模块,因为编译器会引入它们的声明,但编译器不会为它们生成任何目标文件。因此,当链接器进行链接时,它会抱怨缺少定义。在这种情况下,它抱怨mymodule.sayHello
尚未定义。
如果您希望编译器自动搜索第一个模块导入的所有模块并为您编译所有模块,那么您将需要使用rdmd,它是dmd的包装器,它随dmd一起提供。 dmd本身并不这样做。它只编译你告诉它的模块。
您尚未在mymodule中导入std.stdio
。所以,即使你dmd main.d mymodule.d
喜欢(或者更好,dmd -w main.d mymodule.d
或dmd -wi main.d mymodule.d
),它也无法编译mymodule,因为writeln
没有已经宣布。 main.d导入它对mymodule没有影响。
虽然在这种情况下这不是什么大问题,但你真的应该在你的模块顶部放一个module modulename;
声明。编译器将从文件名推断模块名称,但是一旦你有子包,你需要来做,或者你会有导入问题,因为只推断了文件名,而不是包名。因此,如果您有foo/bar/mod.d
,并且module
中没有mod.d
声明,则会将其推断为mod
,而不是foo.bar.mod
。
答案 1 :(得分:4)
dmd mymodule.d main.d
我所知道的唯一能够自行解决依赖关系的语言是Go和Haskell。