【问题标题】:Generate .beam file for imported module为导入的模块生成 .beam 文件
【发布时间】:2020-07-21 22:47:22
【问题描述】:

我正在学习 erlnag,对“.beam”文件的创建有一点疑问。 例如我有 helloworld.erl 和 top.erl 文件,并且 helloworld.erl 被导入到 top.erl 中。

top.erl:

-module(top).
-import(helloworld, [start/0]).
-export([main/0]).

main() ->
  io:fwrite("hello\n"),
  start().

helloworld.erl

-module(helloworld).
-export([start/0]).

start() ->
  io:fwrite("hello world\n").

然后使用“erlc top.erl”编译top.erl。然后,它只创建top.beam文件而不创建helloworld.beam文件。

但是当我们看到python和java的情况下,在编译导入文件时也会为导入的文件生成目标文件。

这是“erlang”的行为(即不为导入的文件创建 .beam 文件)还是我理解错了?

(或)

请说明在运行导入模块时获取“.beam”文件的过程。

谢谢..

【问题讨论】:

    标签: erlang


    【解决方案1】:

    erlc 只编译你要求它编译的文件。您可以使用以下命令编译当前目录中的所有文件:

    erlc *.erl
    

    您可能希望使用工具来构建您的项目。一个内置选项是the make module(不要与make 命令行工具混淆)。你可以运行它:

    erl -make
    

    它会在当前目录中查找一个名为Emakefile 的配置文件,但如果没有,它只会编译目录中的所有源文件。

    其他选择是rebar3erlang.mk

    【讨论】:

      【解决方案2】:

      请说明获取导入文件的“.beam”文件的过程 也在运行导入模块时。

      没有。此外,没有编写 Erlang 的人将 -import 用于模块,因为它混淆了您调用的函数实际上是在哪里定义的,从而混淆了您的代码读者。通常,当您使用语法start() 调用函数时,这意味着该函数是在调用它的模块中定义的,而当在另一个模块中定义函数时,您使用语法helloworld:start() 调用它,它通知代码的读者,他们可以检查helloworld 模块以读取start() 函数的定义。

      但是当我们看到在 python 和 java 的情况下,目标文件将是 在编译导入文件时也为导入的文件生成。

      Erlang 的 -import 不能这样工作。

      【讨论】:

      • 我可以看到将-import 用于一组全局函数的情况,这些函数可能充当其他函数或一组嵌套函数的一种语法糖。所以 global_funs:string_transform() 在被导入后可以被引用为 string_transfor() 。
      • @Samwar,您的用例仍然存在同样的问题。可以选择写明码,也可以选择写乱码。
      猜你喜欢
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-06
      • 2018-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多