在Erlang Cowboy中编译错误 - bug还是我?

时间:2013-09-20 16:12:26

标签: erlang cowboy

我正试图通过严格遵循(例如剪切和粘贴)入门说明来生成Erlang Cowboy版本:

https://github.com/extend/cowboy/blob/master/guide/getting_started.md

一切顺利,直到我创建Makefile并执行$ make。编译过程终止如下:

...
make[1]: Leaving directory `/home/lloyd/hello_erlang/deps/cowboy'
ERLC   hello_erlang_app.erl hello_handler.erl hello_erlang_sup.erl
compile: warnings being treated as errors
src/hello_handler.erl:3: behaviour cowboy_http_handler undefined
make: *** [ebin/hello_erlang.app] Error 1

我已经对我的代码进行了三次检查,但看不到任何我错过的内容。

那么,这是我的错误吗?或者“入门”说明或牛仔本身的错误?如果这是我的错误,我该如何解决?

我已经向essen@ninenines.eu提出了这个问题,但到目前为止还没有回应。

1 个答案:

答案 0 :(得分:5)

问题的原因有两个:

  1. 在您的模块中,您有一个行为声明-behaviour(cowboy_http_handler).。这是完全正确的。
  2. 编译文件时,编译器无法在其搜索路径中找到cowboy_http_handler模块
  3. 这导致错误,因为行为声明告诉编译器出去找到该模块并找出行为所需的回调函数。通常,如果编译器找不到行为模块,或者它可以找到并且缺少一些回调,那么它会发出关于此的警告并继续。但是,Makefile会设置一个编译器选项,将所有警告视为错误,因此编译失败。

    至少有三种解决方案:

    1. 删除编译器选项并接受警告。
    2. 确保编译器可以找到行为模块并进行检查。一个简单的方法是为牛仔梁文件目录添加-pa Dir选项,以便它可以找到该文件。
    3. 设置Erlang,以便自动查找牛仔目录,例如使用$ERL_LIBS
    4. 请注意,即使编译器找到了正确的模块,您仍然必须确保在运行系统时Erlang可以找到该目录。编译时和运行时环境之间没有自动等效。