无法从文档编译和使用Erlang端口驱动程序示例

时间:2014-07-22 10:09:00

标签: erlang

我直接复制粘贴了此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

代码本身有问题或我的编译方法错了吗?

2 个答案:

答案 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