2015-09-01 47 views
0

当我想编译一个简单的file.erl文件时,我收到了错误消息。无法使用文件模块编译Erlang文件

$ 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]). 

它似乎没有人报道这种问题的内容,是有什么问题我做了什么?

+0

我不知道为什么你会得到这种错误,但'file.erl'已经存在于内核源代码中,所以更改模块名称应该有所帮助。 –

+0

@ŁukaszPtaszyński非常感谢 –

回答

2

你的代码是正确的,问题在于文件名。 Erlang有库“文件”,所以你不能使用这个文件名。改变它(不要忘记修改源代码),一切都应该没问题。

+0

非常感谢 –

6

调查编译问题的根本原因是有益的。编译器发出此错误:

/opt/erlang17.5/lib/kernel-3.2/include/file.hrl:34: type date_time() undefined

望着线file.hrl 34,我们看到:

ctime :: file:date_time() | non_neg_integer(), 

这是#file_info{}记录的ctime领域的类型说明符。它指出ctime可以保存file:date_time()类型或non_neg_integer()类型的值。

错误消息特别针对date_time()类型提出抱怨,因为其范围表示它在file模块中定义。在这种情况下,file模块是定义和编译的模块,它隐藏了Erlang/OTP kernel应用程序提供的标准模块。该标准file模块定义其date_time()类型如下:

-type date_time() :: calendar:datetime(). 

file模块我们正在尝试编译,但是,没有。如果我们添加这个类型定义会发生什么?

-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壳:

$ 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() 

我们所用的错误消息,试图调用file:path_eval/2失败,因为它没有定义见。因为我们的file模块隐藏了标准模块,但并不提供所有相同的功能,只要我们的file模块隐藏了标准模块,我们甚至不能启动Erlang外壳。

显然,为模块选择不同的名称对于修复原始编译错误不仅仅是必要的。