使用bitcask进行rebar编译失败 - “errno.h”:没有这样的文件

时间:2014-10-22 12:32:37

标签: compilation makefile erlang rebar

我是Erlang的新手,所以我正在阅读Joe Armstrong的书"编程Erlang"。在第25章中,有一个关于如何使用钢筋的例子。我按照说明创建了一个Makefile

all:
    test -d deps || rebar get-deps
    rebar compile -v
    @erl -noshell -pa './deps/bitcask/ebin' -pa './ebin' -s myapp start

和rebar.config

{deps, [
    {bitcask, ".*", {git, "git://github.com/basho/bitcask.git", "master"}}
]}.

获取依赖项有效,但编译失败。

详细输出告诉我该命令失败

cmd: cc -c $CFLAGS -g -Wall -fPIC  -I"/usr/lib/erlang/lib/erl_interface-3.7.18/include" -I"/usr/lib/erlang/erts-6.2/include"   c_src/bitcask_nifs.c -o c_src/bitcask_nifs.o

出现此错误

/home/user/folder/deps/bitcask/c_src/bitcask_nifs.c:22:19: fatal error: errno.h: No such file or directory

但是

find /usr/include -name errno.h

给了我

/usr/include/x86_64-linux-gnu/asm/errno.h
/usr/include/asm/errno.h
/usr/include/linux/errno.h
/usr/include/asm-generic/errno.h

所以我在问自己..

  • 我错过了什么?
  • 如何告诉rebar有关C库的依赖关系以及在哪里找到它们?
  • 为什么没有在bitcask的Makefile中正确配置?

也许我在寻找错误的条款,但我无法在互联网中找到任何解决方案。
非常感谢提前

1 个答案:

答案 0 :(得分:0)

有两件事需要考虑

钢筋选项

您可以设置使用port_env option in rebar.config编译C代码的选项。

comiling deps

由于bitstack是你的依赖,它不是用你的rebar配置编译的,而是它自己的。因此,如果您想要更改任何内容,则必须修改bitcask文件。

幸运的是,如果你研究config their writen,所有的C编译都是用环境变量$ERL_CFLAGS完成的。同样,在rebar source code中,您可以看到此标志负责编译中的包含路径。

如此简单的方法是在编译之前在Makefile中扩展$ERL_CFLAGS,类似这样的事情

all: ERL_CFLAGS = "$ERL_CFLAGS -I /usr/include/linux/errno.h"
all: 
    test -d deps || rebar get-deps
    rebar compile -v
    @erl -noshell -pa './deps/bitcask/ebin' -pa './ebin' -s myapp start

请确保此包含适用于您,并且您不会覆盖正在使用的任何标记。