Module **异常错误:未定义的函数eredis:start\u link/0

Module **异常错误:未定义的函数eredis:start\u link/0,module,include,erlang,Module,Include,Erlang,我正试图在我的Erlang项目中包含连接到redis的。我把它放在一个lib/目录中,并使用了-include_lib(../lib/eredis/include/eredis.hrl”)。它在erl中编译得很好,但是尝试创建客户端失败,**异常错误:未定义函数eredis:start_link/0 redis_worker.erl: -module (redis_worker). -export ([get/2, set/3, client/0]). -include_lib ("../lib

我正试图在我的Erlang项目中包含连接到redis的。我把它放在一个lib/目录中,并使用了
-include_lib(../lib/eredis/include/eredis.hrl”)。
它在
erl
中编译得很好,但是尝试创建客户端失败,
**异常错误:未定义函数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]).
-模块(redis\u worker)。
-导出([get/2,set/3,client/0])。
-include_lib(“../lib/eredis/include/eredis.hrl”)。
客户端()->
eredis:启动链接()。
获取(客户端,密钥)的时间是\u列表(密钥)->
{ok,Val}=eredis:q(客户机,[“GET”,Key]),
io:format(“获取键:~s,其值为~s~n”,[key,Val])。
当is_列表(键)和ALSO is_列表(值)时设置(客户端、键、值)->
{ok,}=eredis:q(客户机,[“SET”,键,值],
io:format(“将key:~s设置为~s~n”,[key,Value])。

为什么它编译得很好(我假设这意味着执行
include_-lib
),但当我尝试使用包含的库时却会崩溃?

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,并通过
-pa
编译和传递适当的依赖项路径。但是,在SAN钢筋设置中,这意味着编译后直接将
-pa../lib/eredis/include/eredis.hrl
传递给erl<代码>-pa将把该目录包含到您的代码路径中。

您编译过eredis吗?您的加载路径中是否有eredis/ebin目录?编译和加载是具有不同路径的不同操作。使用ERL_LIBS env变量可以更轻松地加载模块。我已经使用rebar创建了一个应用程序,但我只是想测试一下。现在我必须在
erl
中手动编译我需要的每个文件,这太痛苦了。那么对于钢筋,这应该是什么样子呢?很简单!尝试类似的方法,然后你就不需要“包含”任何东西,你可以直接引用模块eredis。太棒了!所以我猜我应该删除lib哈哈