2015-09-01 45 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外殼。

顯然,爲模塊選擇不同的名稱對於修復原始編譯錯誤不僅僅是必要的。