Erlang驱动程序错误

pgccezyw  于 2022-12-08  发布在  Erlang
关注(0)|答案(1)|浏览(218)

我必须编写一个Erlang驱动程序,所以我开始尝试一个小的:driverc.c,代码很简单,驱动程序Erlang数据是一个长数字的地址,每次调用驱动程序都要将该数字增加n或将该数字乘以nn只是一位数(0,...,9),并作为char传递,代码为:

#include<stdio.h>
#include<stdlib.h>
#include<erl_driver.h>
#include<ei.h>
#include<string.h>

#define SOMME 1
#define PRODUIT 2

static ErlDrvData start(ErlDrvPort port, char *command) ;

static void stop(ErlDrvData data) ;

static ErlDrvSSizeT control(ErlDrvData data, unsigned int command, char *buf, ErlDrvSizeT len, char **rbuf, ErlDrvSizeT rlen);

static long *number;

static ErlDrvEntry myentry={
NULL,
start,
stop,
NULL,
NULL,
NULL,
"driverc",
NULL,
NULL,
control,
NULL,
NULL,
NULL,
NULL,
NULL
};

DRIVER_INIT(driverc)
{return &myentry;}

ErlDrvData start(ErlDrvPort port, char *command)
{number=(long*)driver_alloc(sizeof(long)) ;
*number=0;
set_port_control_flags(port,PORT_CONTROL_FLAG_BINARY);
return (ErlDrvData)number;
}

void stop(ErlDrvData data)
{long *olddata;
 olddata=(long*)data;
 driver_free(olddata);
}

ErlDrvSSizeT control(ErlDrvData data, insigned int command, char *buf, ErlDrvSizeT len, char **buf, ErlDrvSizeT rlen)
{long    reply, m, *olddata, newdata;
 int     index, result, n;
 char    c;

 c=*buf;
 n=c-'0'; /* convert character representation to true integer digit */
 m=(long)n;
 olddata=(long*)data;
 index=0;
 switch (command) {
 case SOMME : newdata=(*olddata)+m;
              *olddata=newdata;
              reply=newdata;
              break;

 case PRODUIT : newdata=(*olddata)*m;
                *olddata=newdata;
                reply=newdata;
                break;

 default : reply=-1;
                 break;
                   }
result=ei_encode_long(*rbuf,&index,reply) ; /* this function convert a long number (reply) to binary and write it in *rbuf */
return sizeof(reply) ;
}

当我试图编译它的时候,它返回的错误使我无法知道问题出在哪里,shell输出如下。

cc driverc.c  -I/usr/local/lib/erlang/usr/include

error : undefined symbol : main
referenced by .... 
error : undefined symbol : driver_alloc
referenced by .... 
error : undefined symbol : set_port_control_flags
referenced by .... 
error : undefined symbol : ei_encode_long
referenced by .... 
error : linked command failed with exit code 1 ....

https://ibb.co/LnTDtmt

irlmq6kh

irlmq6kh1#

从“编译和链接示例驱动程序”文档中:
驱动程序将被编译并链接到一个共享库(Windows上的DLL)。使用gcc,这是通过链接标志-shared-fpic完成的。由于我们使用ei库,我们也应该包括它。
链接器抱怨找不到main,因为它认为它正在构建一个独立的程序。将它构建为一个共享库应该可以解决这个问题。
Erlang/OTP存储库中有可能有用的a sample Makefile-它包括所有必需的标志。

相关问题