我创建了一个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。