我在StackOverflow和Google上查看了这里的问题,以获取在rebar中设置基本NIF项目以包装C ++库的示例。
我曾经在GitHub上的图书馆项目作为指南:
我的项目在这里:
https://github.com/project-z/emutton/
当我执行rebar compile && rebar eunit
时,我在eunit测试中失败,因为找不到emtn.so
:
$ rebar compile && rebar eunit
==> emutton (compile)
==> emutton (eunit)
undefined
*** test module not found ***
**emtn
=ERROR REPORT==== 25-Jun-2013::12:21:55 ===
The on_load function for module emtn returned {error,
{load_failed,
"Failed to load NIF library: 'dlopen(/.../source/emutton/priv/emtn.so, 2): image not found'"}}
=======================================================
Failed: 0. Skipped: 0. Passed: 0.
One or more tests were cancelled.
ERROR: One or more eunit tests failed.
ERROR: eunit failed while processing /.../source/emutton: rebar_abort
当我致电rebar compile
时,它只生成一个驱动程序文件emtn_drv.so
而没有emtn.so
:
$ tree priv
priv
└── emtn_drv.so
0 directories, 1 file
我在c_src/build_deps.sh
中有一个echo语句,当我调用rebar clean
时,我看不到输出。它的行为似乎完全忽略了pre_hook
中的post_hook
和rebar.config
:
{pre_hooks, [{compile, "c_src/build_deps.sh"}]}.
{post_hooks, [{clean, "c_src/build_deps.sh clean"}]}.
rebar
显示无输出的示例:
$ rebar compile
==> emutton (compile)
$ rebar clean
==> emutton (clean)
因为我克隆了tuncer的RE2绑定项目,当我执行rebar compile
时看到他的build_deps.sh脚本的输出。我的权限与他的权限匹配:
-rwxr-xr-x 1 ajl staff 891B Jun 25 12:30 c_src/build_deps.sh
知道我在这里缺少什么吗?我相信正确配置钢筋以调出脚本并进行编译。
答案 0 :(得分:2)
您的问题是您的rebar.config中的行
https://github.com/project-z/emutton/blob/master/rebar.config%20#L1
与您尝试加载的内容不匹配
https://github.com/project-z/emutton/blob/master/src/emtn.erl#L25
您应该将rebar.config更改为
{port_specs, [{"priv/emtn.so",["c_src/emtn_nif.c"]}]}.
并将emtn.erl更改为
erlang:load_nif(filename:join(PrivDir, "emtn"), 0). % ?MODULE is an atom, I believe you need a string
或将emtn.erl更改为
erlang:load_nif(filename:join(PrivDir, "emtn_drv"), 0).