Ошибки драйвера Erlang

Мне нужно написать драйвер на Erlang, поэтому я начал с небольшого испытания: driverc.c , код прост, данные Erlang драйвера - это адрес длинного числа, и каждый вызов драйвера должен увеличивать это число или умножать это число на, n представляет собой однозначное число (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;
 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)+n;
              *olddata=newdata;
              reply=newdata;
              break;

 case PRODUIT : newdata=(*olddata)*n;
                *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) ;
} 

Когда я пытался его скомпилировать, он возвращает ошибки, я не могу знать, в чем проблема, вывод оболочки ниже.

      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

1 ответ

Из документации «Компиляция и компоновка образца драйвера»:

Драйвер должен быть скомпилирован и связан с общей библиотекой (DLL в Windows). В gcc это делается с помощью флагов ссылок. -sharedа также -fpic. Поскольку мы используем eiбиблиотеку, мы должны включить ее тоже.

Компоновщик жалуется, что не находит main, потому что он думает, что создает отдельную программу. Создание его как разделяемой библиотеки должно исправить это.

В репозитории Erlang/OTP есть образец Makefile , который может быть полезен — он включает все необходимые флаги.

Другие вопросы по тегам