**异常错误:未定义的函数eredis:start_link / 0

时间:2012-09-02 15:33:35

标签: module include erlang

我正在尝试将eredis包含在我的Erlang项目中以连接到redis。我把它放在一个lib /目录中,并使用-include_lib ("../lib/eredis/include/eredis.hrl").它在erl中编译得很好,但是然后尝试创建一个客户端失败了** exception error: undefined function eredis:start_link/0

redis_worker.erl:

-module (redis_worker).
-export ([get/2, set/3, client/0]).
-include_lib ("../lib/eredis/include/eredis.hrl").

client() ->
  eredis:start_link().

get(Client, Key) when is_list(Key) ->
  {ok, Val} = eredis:q(Client,["GET", Key]),
  io:format("Got key: ~s which had value ~s~n", [Key, Val]).

set(Client, Key, Value) when is_list(Key) andalso is_list(Value)->
  {ok, <<"OK">>} = eredis:q(Client, ["SET", Key, Value]),
  io:format("Set key: ~s to ~s~n",[Key, Value]).

为什么它编译正常(我假设它意味着执行include_lib)但是当我尝试使用包含的库时会爆炸?

1 个答案:

答案 0 :(得分:2)

include_lib一直是轻微混淆的根源。 include_lib的行为几乎与include相同,但不应指向文件路径。在include_lib中,假定第一个路径组件是应用程序的名称。

例如

-include_lib("../lib/eredis/include/eredis.hrl").

将使用代码:lib_dir(lib)查找当前(最新)版本lib的目录,然后在子目录include中搜索文件eredis / include / eredis.hrl(忽略模式替换)。

值得注意的是,Erlang中依赖的一般首选策略是使用rebar并编译并传递via -pa中的相应依赖路径。但是,在你的sans rebar设置中,这意味着在编译后直接将-pa ../lib/eredis/include/eredis.hrl传递给erl。 -pa会将该目录包含在您的代码路径中。