Newbie questions about Pliant

Newbie questions about Pliant

Interfacing .page programs with foreign languages

I want to call a C function from a .page program
Message posted by marcus on 2004/01/27 20:25:48
The test program below works when I run it from the console.

function test i
  arg Int i
  external "libtest.so" "f"

test 4

But when I run it through the server (i.e., as a .page program), Pliant complains:

Failed to load ELF DLL libtest.so

Any hints on how to fix that?
Message posted by hubert.tonneau on 2004/01/28 10:38:22
Put the wrapping code in a .pli, and call it though 'module' from the .page

The explaination might be that the module associated with a .page is not stable
(a .page will recompile on the fly),
or the fact that in a .page, all the code is in facts a function, so I might
have tiny bugs with the definition of a function (test) within a function (the .page
function)
Message posted by marcus on 2004/01/28 17:15:46
Did not work.

Here is my test.page program:

module "interf.pli"

test 4

My interf.pli program:

public

function test i
  arg Int i
  external "libtest.so" "f"

My C program which implements function f:

void f(int x) {}

How I generated the shared library libtest.so
  gcc -fPIC -c test.c
  gcc -shared -o libtest.so test.o

And finally, the error message the server presents when I try to visit test.html

There is a bug in the dynamic page /temp/test.html.

Failed to load ELF DLL libtest.so
compile /temp/interf.pli (internals) 5 3
compile /temp/interf.pli (internals) 5 3
...



Message posted by hubert.tonneau on 2004/01/29 10:50:36
Once again, you have the same problem: if the DLL is not properly declared at OS
level (ldconfig), you have to use the absolute path in the 'external' instruction.
Message posted by marcus on 2004/01/29 13:37:29
By 'use the absolute path in the 'external' instruction' you mean, replace

   external "libtest.so" "f"

with

   external "file:/home/m3santos/pliant/temp/libtest.so" "f"


I have tried that, but it didn't work. Same error message.


Message posted by marcus on 2004/01/29 14:01:49
Solved, at OS level: had to set the Linux variable LD_LIBRARY_PATH to point to 
my shared library.

Intriguing. When the program runs from the console, it works without me having
to set that variable at the OS level.



Message posted by hubert.tonneau on 2004/01/29 16:19:26
No: the absolute path is:
external "/home/m3santos/pliant/temp/libtest.so" "f"

I know that's not very consistent, but the path you provide is passed traight
forward to operating system level.