簡體   English   中英

無法使用文件模塊編譯Erlang文件

[英]Can not compile Erlang file using file module

當我想編譯一個簡單的file.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]).

似乎沒有人報告過此類問題,我的操作有什么問題嗎?

調查編譯問題的根本原因很有幫助。 編譯器發出此錯誤:

/opt/erlang17.5/lib/kernel-3.2/include/file.hrl:34:鍵入date_time()未定義

查看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應用程序提供的標准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 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 ()

在錯誤消息中,我們可以看到嘗試調用file:path_eval/2失敗,因為未定義。 因為我們的file模塊隱藏了標准模塊,但沒有提供所有相同的功能,所以只要我們的file模塊隱藏標准模塊,我們甚至無法啟動Erlang Shell。

顯然,不僅要解決原始的編譯錯誤,還需要為模塊選擇一個不同的名稱。

您的代碼正確,問題出在文件名上。 Erlang具有庫“文件”,因此您不能使用此文件名。 更改它(別忘了修改源代碼),一切都會好起來的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM