File 无法使用文件模块编译Erlang文件
当我想编译一个简单的File 无法使用文件模块编译Erlang文件,file,erlang,File,Erlang,当我想编译一个简单的文件.erl文件时,我收到了错误消息 $ erlc file.erl /opt/erlang17.5/lib/kernel-3.2/include/file.hrl:34: type date_time() undefined 下面是file.erl的内容 -module(file). -include_lib("kernel/include/file.hrl"). -export([file_info/1]). file_info(Dir) -> {ok
文件.erl
文件时,我收到了错误消息
$ erlc file.erl
/opt/erlang17.5/lib/kernel-3.2/include/file.hrl:34: type date_time() undefined
下面是file.erl的内容
-module(file).
-include_lib("kernel/include/file.hrl").
-export([file_info/1]).
file_info(Dir) ->
{ok, F} = file:read_file_info(Dir),
io:format("~p~n", [F#file_info.type]).
似乎没有人报告此类问题,我所做的有什么问题吗?您的代码是正确的,问题在于文件名。Erlang具有库“文件”,因此不能使用此文件名。更改它(别忘了修改源代码),一切都会好起来。调查编译问题的根本原因很有帮助。编译器发出以下错误: /opt/erlang17.5/lib/kernel-3.2/include/file.hrl:34:type date\u time()未定义 查看
file.hrl
的第34行,我们看到:
ctime :: file:date_time() | non_neg_integer(),
这是#file_info{}
记录的ctime
字段的类型说明符。它声明ctime
可以保存文件:date\u time()
类型或非负整数()类型的值
错误消息特别抱怨date\u time()
类型,因为它的范围表明它是在文件中定义的。在本例中,文件
模块是正在定义和编译的模块,它隐藏了Erlang/OTP内核
应用程序提供的标准模块。标准的文件
模块将其日期_时间()
类型定义如下:
-type date_time() :: calendar:datetime().
但是,我们试图编译的文件
模块没有。如果添加此类型定义会发生什么
-module(file).
-type date_time() :: calendar:datetime().
-include_lib("kernel/include/file.hrl").
-export([file_info/1]).
file_info(Dir) ->
{ok, F} = file:read_file_info(Dir),
io:format("~p~n", [F#file_info.type]).
编译包含添加的类型定义的此版本现在可以工作:
$ erlc file.erl
$
我们已经修复了编译错误,所以让我们尝试使用编译后的模块。我们启动一个Erlang shell:
$ erl
Erlang/OTP 18 [erts-7.0] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:10] [hipe] [kernel-poll:false]
{"init terminating in do_boot",{undef,[{file,path_eval,[[".","/Users/user"],".erlang"],[]},{c,f_p_e,2,[{file,"c.erl"},{line,481}]},{init,eval_script,8,[]},{init,do_boot,3,[]}]}}
Crash dump is being written to: erl_crash.dump...done
init terminating in do_boot ()
我们可以在错误消息中看到,尝试调用文件:path_eval/2
失败,因为它没有定义。因为我们的文件
模块隐藏了标准shell,但没有提供所有相同的函数,所以只要文件
模块隐藏了标准shell,我们甚至无法启动Erlang shell
显然,为模块选择不同的名称不仅仅是修复原始编译错误所必需的。我不确定为什么会出现这种错误,但是file.erl
已经存在于内核源代码中,因此更改模块名称应该会有所帮助。@ukaszPtaszyński非常感谢