我查看了 StackOverflow 上的问题,并在 Google 上搜索了一个在 rebar 中设置基本 NIF 项目以包装 C++ 库的示例。

我曾经在 GitHub 上以库项目为指导:

https://github.com/tuncer/re2

我的项目在这里:

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_hookpost_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 绑定(bind)项目,并且当我执行 rebar compile 时会看到他的 build_deps.sh 脚本的输出。我的权限与他的权限一致:
-rwxr-xr-x  1 ajl  staff   891B Jun 25 12:30 c_src/build_deps.sh

知道我在这里缺少什么吗?我相信 rebar 配置正确,可以调用脚本并进行编译。

最佳答案

你的问题是你的 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).

关于erlang - 您如何使用钢筋设置 Erlang NIF 项目?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17306235/

10-13 09:21