无法加载NIF库

时间:2015-04-24 11:01:43

标签: c erlang

我创建了一个DLL“Addition.dll”,其中我实现了hello功能 这些是我用于创建库的文件: main.cpp中:

#include "main.h"

//Hello function
static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM    argv[])
{
return enif_make_string(env, "Hello world!", ERL_NIF_LATIN1);
}

static ErlNifFunc nif_funcs[] =
{
 {"hello", 0, hello}
};

ERL_NIF_INIT(niftest,nif_funcs,NULL,NULL,NULL,NULL)

/*************************DLL  Main*******************************************/

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
    case DLL_PROCESS_ATTACH:
        // attach to process
        // return FALSE to fail DLL load
        break;

    case DLL_PROCESS_DETACH:
        // detach from process
        break;

    case DLL_THREAD_ATTACH:
        // attach to thread
        break;

    case DLL_THREAD_DETACH:
        // detach from thread
        break;
 }
 return TRUE; // successful
}

main.h:

#define __MAIN_H__
#include <windows.h>
#include <erl_nif.h>

#define DLL_EXPORT __declspec(dllexport)

#ifdef __cplusplus
extern "C"
{
#endif
/********************************Library   functions******************************/

static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM  argv[]);

#ifdef __cplusplus
}
#endif

#endif // __MAIN_H__

我的目标是使用erlang模块调用此函数,所以我实现了“niftest.erl”,如下所示:

-module(niftest).
-export([init/0, hello/0]).
-on_load(init/0).

init() ->
  erlang:load_nif("./Addition", 0).

hello() ->
  "NIF library not loaded".

当然把Addition.dll放在“niftest.erl”的同一个文件夹中但是当我运行niftest时我有这个错误

4> c(niftest).

=ERROR REPORT==== 24-Apr-2015::11:43:17 ===
The on_load function for module niftest returned {error,
                                              {load_failed,
                                               "Failed to load NIF library    ./Addition.dll: 'Le module spécifié est introuvable.'"}}
{error,on_load_failure}

提前感谢帮助我

2 个答案:

答案 0 :(得分:2)

路径名"./Addition"表示您尝试从当前工作目录加载NIF库,但由于NIF不存在而失败。通常,NIF库存储在应用程序的priv目录下,您可以编写代码来查找它,如下所示:

init() ->
    SoName = filename:join(case code:priv_dir(?MODULE) of
                               {error, bad_name} ->
                                   %% this is here for testing purposes
                                   filename:join(
                                     [filename:dirname(
                                        code:which(?MODULE)),"..","priv"]);
                               Dir ->
                                   Dir
                           end, "Addition"),
    erlang:load_nif(SoName, 0).

请注意处理{error, bad_name}的部分:这对于开发目的很方便,因为如果尚未安装应用程序,则此部分将找到尝试加载NIF的模块的路径,假设为{{1} } directory是其目录的兄弟,并尝试从那里加载NIF。

答案 1 :(得分:0)

我遇到了同样的问题。在我的情况下,错误是我通过x32平台编译了DLL,但我安装了Erl x64。