Newbie questions about Pliant

Newbie questions about Pliant

C function

How to call c function
Message posted by maybe Rogerio justino on 2002/09/13 21:42:52
I got a program wrote in c, and i want to build the inteface using pliant. How can i do that ?
Message posted by maybe Hubert Tonneau on 2002/09/13 21:58:34
You have to compile your C program as a DLL, then you can use it from Pliant.

if your C function is let's say:

  int foo(char *a,int b);

then the Pliant prototype will be:

  function foo a b -> i
    arg Strz a ; arg Int b i
    external "your_dll_name" "foo"
Message posted by maybe Marcus on 2003/12/07 16:17:16
I have a C library file (called lib.c) with the following function:

static void func(int f[], int n) {
  int i;
  for (i=0; i<n; i++)
    f[i]= i;
}

I have generated my shared object file as follows:

gcc -fPIC -c lib.c

then

gcc -shared -o libfunc.so lib.o

The Pliant code below uses function 'func':

function _func f n
  arg Address f ; arg Int n
  external "libfunc.so" "func" #dll wrapper

function func f n
  arg Array:Int f; arg Int n
  _func  addressof:(f first) n #call dll wrapper.


function test
  var Array:Int a
  for (var Int i) 0 10
    a += 0
  func a 10
  for i 0 10
    console a:i eol

test

But when I run it, Pliant says:

   Could not find function func in ELF DLL libfunc.so

Any help?
Message posted by hubert.tonneau on 2003/12/07 16:24:30
Try with the absolute path to your library in the 'external' Pliant instruction.
Message posted by maybe Marcus on 2003/12/07 16:58:22
Didn't work. 

Pliant says:

  Could not find function func in ELF DLL /home/m3santos/pliant/test/libfunc.so

Also, it does not work if I put "file:...." in the 'external' instruction.

Mujtaba, has been coaching me on how to link Pliant and C. In his Pliantcode, 
he does not use the absolute path. And it works fine.

I even tried to add that Pliant+C code (plus the .so file) to a working Pliant+C 
code which Mujtaba has sent me, but I get the same error. If I take my additions
out, Mujtaba's Pliant+C code works.


Message posted by maybe Marcus on 2003/12/07 21:04:56
Mujtaba has found the problem: it's in the type of my C function:

static void func(...)

If I change it to 

void func(...)

it works.

In Mujtaba's words: "I think its becaused you declared the C function as 
"static" what this means is that the C compiler will mangle the function name 
so that its uniquely called inside that module, so that no external modules 
will be able to reference it using that name."