gpt4 book ai didi

c - 加载 NIF 库失败

转载 作者:太空宇宙 更新时间:2023-11-04 01:58:54 24 4
gpt4 key购买 nike

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

主要.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 不存在而失败。通常 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。

关于c - 加载 NIF 库失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29845783/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com