調查編譯問題的根本原因是有益的。編譯器發出此錯誤:
/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外殼。
顯然,爲模塊選擇不同的名稱對於修復原始編譯錯誤不僅僅是必要的。
我不知道爲什麼你會得到這種錯誤,但'file.erl'已經存在於內核源代碼中,所以更改模塊名稱應該有所幫助。 –
@ŁukaszPtaszyński非常感謝 –