我直接复制粘贴了此link中提供的Erlang文档中的代码。
在页面末尾,他们使用以下命令编译
gcc -o exampledrv -fpic -shared complex.c port_driver.c
但编译器无法找到标头erl_driver.h
,所以我继续编译
gcc -o exampledrv -fpic -shared complex.c port_driver.c -I/usr/local/lib/erlang/usr/include -L -lerl_driver
编译没有任何错误;但是我无法运行compex5 : start("./exampledrv").
;因为共享库无法成功加载。
我目前正在使用Erlang版本:17
代码本身有问题或我的编译方法错了吗?
答案 0 :(得分:0)
看起来您的库不在公共库目录中。因此,您应该将其文件夹的路径包含到环境变量LD_LIBRARY_PATH中。你可以在shell中做到
export LD_LIBRARY_PATH=/path/to/library/dir
然后在同一个shell中启动您的应用程序。您也可以将此行添加到/ etc / profile或〜/ .bashrc中,每次启动shell时都会自动分配变量。
或者你可以这样启动你的端口
start("LD_LIBRARY_PATH=/path/to/library/dir ./exampledrv")
答案 1 :(得分:0)
我从exampledrv.so
和{}重新命名了文件exampledrv
在我的启动函数中添加了以下代码行来解决问题:
code:add_path("/home/nihal/Documents/Erlang/C/Fresh/driver/"),
DriverPath = "/home/nihal/Documents/Erlang/C/Fresh/driver/",
在加载共享库之前添加了这些行。
start(SharedLib) ->
code:add_path("/home/nihal/Documents/Erlang/C/Fresh/driver/"),
DriverPath = "/home/nihal/Documents/Erlang/C/Fresh/driver/",
case erl_ddll:load_driver(DriverPath, SharedLib) of
ok -> ok;
{error, already_loaded} -> ok;
_ ->
exit({error, could_not_load_driver})
end,
spawn(?MODULE, init, [SharedLib]).
参考:this blog。