Module 在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 错误输

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

以下是我的主.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
  • 您需要在命令行上列出正在编译的所有模块。如果您没有列出一个模块,那么它将不会被编译。编译的模块将能够使用未编译的模块,因为编译器会提取它们的声明,但编译器不会为它们生成任何对象文件。因此,当链接器转到link时,它会抱怨缺少定义。在本例中,它抱怨没有定义
    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没有影响

  • 虽然在这种情况下这不是什么大问题,但您确实应该放置一个
    模块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