Module 在D中导入模块
我正在尝试使用D(语言版本2)中的基本模块导入。作为指导,我使用了dlang.org上的示例,但我的简单程序无法编译。这些文件位于同一目录中 以下是我的主.d文件的内容:Module 在D中导入模块,module,d,Module,D,我正在尝试使用D(语言版本2)中的基本模块导入。作为指导,我使用了dlang.org上的示例,但我的简单程序无法编译。这些文件位于同一目录中 以下是我的主.d文件的内容: import std.stdio; import mymodule; void main(string[] args){ sayHello(); writeln("Executing Main"); } 下面是我的模块文件的内容(mymodule.d): 要编译,我通过bash执行: dmd main.d 错误输
import std.stdio;
import mymodule;
void main(string[] args){
sayHello();
writeln("Executing Main");
}
下面是我的模块文件的内容(mymodule.d):
要编译,我通过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
mymodule.sayHello
如果您希望编译器自动搜索第一个模块导入的所有模块并为您编译它们,那么您需要使用rdmd,它是dmd的包装器,dmd随附。dmd本身不这样做。它只编译您告诉它的模块
std.stdio
。因此,即使您像您应该的那样执行dmd main.d mymodule.d
(或者更好,dmd-w main.d mymodule.d
或dmd-wi main.d mymodule.d
),它也无法编译mymodule,因为writeln
尚未声明。main.d导入它对mymodule没有影响
模块modulename代码>模块顶部的声明。编译器将根据文件名推断模块名,但一旦有子包,就需要这样做,否则导入时会出现问题,因为只会推断文件名,而不会推断包名。因此,如果您有foo/bar/mod.d
,并且在mod.d
中没有module
声明,它将被推断为mod
,而不是foo.bar.mod
dmd mymodule.d main.d
据我所知,能够独立计算依赖关系的语言只有Go和Haskell。。把它贴出来作为一个正确的答案,这样我就能给你认可。当之无愧即使你不关心要点,至少这样我可以把问题标记为已回答。只需使用rdmd——只构建main.d.
rdmd
将计算出依赖项rdmd main.d
将构建文件和所有依赖项并执行结果。如果您只想构建,请在命令中添加--buildonly
。我喜欢Haskell中的这个特性。我希望D也有这个功能。说得迂腐一点,我认为Go或Haskell都没有这个功能,但他们的编译器有。一个符合规范的D编译器也可以拥有它。至少在go的情况下,工具确实是语言的一部分。就haskell而言,我可能应该学究式地说“ghc”,但说真的,这些天谁不使用ghc?我想这是不可能的,因为在D中,你可以在不同的目录中使用foo.bar.module(同名!)!Go和Haskell可能无法指定不同的源路径?
main.o: In function `_Dmain':
main.d:(.text._Dmain+0x5): undefined reference to `_D8mymodule8sayHelloFZv'
collect2: ld returned 1 exit status
--- errorlevel 1