我是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
所以我在问自己..
也许我在寻找错误的条款,但我无法在互联网中找到任何解决方案。
非常感谢提前
答案 0 :(得分:0)
有两件事需要考虑
您可以设置使用port_env
option in rebar.config
编译C代码的选项。
由于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
请确保此包含适用于您,并且您不会覆盖正在使用的任何标记。