我创建了一个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}
提前感谢帮助我
答案 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。