gpt4 book ai didi

module - 在 D 中导入模块

转载 作者:行者123 更新时间:2023-12-02 09:46:34 24 4
gpt4 key购买 nike

我正在尝试在 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

最佳答案

  1. 您需要列出正在命令行上编译的所有模块。如果您不列出模块,则不会编译该模块。已编译的模块将能够使用未编译的模块,因为编译器会提取它们的声明,但编译器不会为它们生成目标文件。因此,当链接器进行链接时,它会提示缺少定义。在本例中,它提示 mymodule.sayHello 尚未定义。

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

  2. 您尚未在 mymodule 中导入 std.stdio。因此,即使您按照应有的方式执行 dmd main.d mymodule.d(或者更好,dmd -w main.d mymodule.ddmd -wi main.d mymodule.d),它将无法编译 mymodule,因为 writeln 尚未声明。 main.d 导入它的事实对 mymodule 没有影响。

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

关于module - 在 D 中导入模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11123931/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com