RobinVossen has asked for the wisdom of the Perl Monks concerning the following question:

And once again I am wondering if you guys can point me at my flaws.

I am playing about with a very small piece of Perl code that should load a C Library and echo it. This is my code:

use warnings; use strict; use C::DynaLib; my $c_libary = new C::DynaLib("./modules/test.o")||die "Failed to load +: $!\n"; my $c_subroutine = $c_libary->DeclareSub("test", "p"); print &{$c_subroutine}

And this should be just fine as its so clear to the example the page shows.

The test.o's sourcecode:
char* test() { return "WORKS!"; }

The error that Perl flings back at me is: Can't call method "DeclareSub" without a package or object reference when I remove the die. SO I know it can't load the Library. I already gave it 777 to 'just-be-sure'.
So, any advice/tips/fixes/documents?
Thanks!

Replies are listed 'Best First'.
Re: Problem with C::DynaLib
by almut (Canon) on Jan 17, 2010 at 22:40 UTC

    I suppose the lib to be loaded needs to be a shared (aka dynamic) object — from your .o extension I figure it is not.

    Compile your C test code as follows (and then load the .so file):

    $ cc -c -fPIC test.c $ cc -shared test.o -o test.so

    Update: just tried it, and although it works fine (when compiling as shown above) with code samples such as

    int test() // ->DeclareSub("test", "i") { return 42; } void test() // ->DeclareSub("test", "") { printf("WORKS!\n"); }

    I couldn't get it to work with your sample returning a char* (I get an "Illegal instruction" exception (SIGILL)).  Apparently, "p" is not the appropriate type specifier here...

      Thanks a lot.
      I wasn't aware of the cc - shared thing.
      Thanks =)