我创建了一个DLL“Addition.DLL”,在其中实现了hello函数
以下是我用于创建库的文件:
主.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
}

主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}

提前谢谢你帮我

最佳答案

路径名"./Addition"表示您正试图从当前工作目录加载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的模块的路径,假设priv目录是其目录的同级目录,并尝试从那里加载NIF。

10-07 13:42