in reply to Re: Including existing C or CPP library using Inline
in thread Including existing C or CPP library using Inline

Dear Rob,

I followed your advise and including  use Inline CPP; did help. Now, I am still struggling with passing perl strings to the function itself, which I guess is the reason for the function not being found. I wrote another function that is supposed to just print the passed string via cout and I also get the subroutine not found error. Integers work fine though, so it seems that converting the perl strings to C++ strings needs some work around.

Best, René

Replies are listed 'Best First'.
Re^3: Including existing C or CPP library using Inline
by syphilis (Archbishop) on Mar 12, 2014 at 23:30 UTC
    I wrote another function that is supposed to just print the passed string via cout and I also get the subroutine not found error

    It's hard to be certain without seeing the code, but it sounds like Inline might be unable to bind to the function.
    Rather than having anything to do with the arguments being passed, this would more likely be due to an unrecognised type being returned by the function.

    We really need to see the code you've tried, along with the error messages you're getting in order to be of much assistance.

    Cheers,
    Rob
      Hi Rob,

      Here's the code I mentioned in my previous post. The 'add' function works properly if I execute it, whereas calling 'doSSW' results in a "Undefined subroutine" error. Thus my guess is that the issue lies with passing Perl strings to a C++ function.

      Best, René
      #!/usr/bin/perl use warnings; use Inline CPP => Config => BUILD_NOISY => 1, CLEAN_AFTER_BUILD => 0; use Inline CPP => Config => AUTO_INCLUDE => '#include "ssw_cpp.h"'; use Inline CPP; my $ref = "CAGCCTTTCTGACCCGGAAATCAAAATAGGCACAACAAA"; my $seq = "CTGAGCCGGTAAATC"; print add(3,5)."\n"; my $returned = cprintit($seq); print $returned."\n"; #my $cigar = do_SSW($seq,$ref); #print "$cigar\n"; __END__ __CPP__ using namespace std; string do_SSW(const char* queryC, const char* refC) { Inline_Stack_Vars; string query(queryC); string ref(refC); StripedSmithWaterman::Aligner aligner; StripedSmithWaterman::Filter filter; StripedSmithWaterman::Alignment alignment; aligner.Align(query.c_str(), ref.c_str(), ref.size(), filter, &ali +gnment); return alignment.cigar_string; } int add (const int a, const int b) { int c = a+b; return c; } int cprintit(const string seq) { cout << seq << endl; return 10; }
        Thus my guess is that the issue lies with passing Perl strings to a C++

        I think it might have more to do with the way that the string has been passed.
        For example, cprintit() works fine if you rewrite it as:
        int cprintit(const char * seq) { cout << seq << endl; return 10; }
        That's how you've passed the strings to do_SSW() - the problem with do_SSW() is that you've specified a *return* of type "string".
        Perl's typemapping doesn't handle passing of the "string" type (either as argument or as return). You'll need to provide a typemap for "string" if you want to pass that type around.
        What happens if you specify a return type of "char *" (instead of "string") for do_SSW() ?

        For a solution using a typemap, this works for me:
        #!/usr/bin/perl use warnings; use Inline CPP => Config => BUILD_NOISY => 1, TYPEMAPS => 'C:/_32/pscrpt/inline-cpp/stringtype.map', CLEAN_AFTER_BUILD => 0; use Inline CPP; my $seq = "CTGAGCCGGTAAATC"; my $returned = cprintit($seq); print $returned."\n"; __END__ __CPP__ using namespace std; int cprintit(string seq) { cout << seq << endl; return 10; }
        where 'C:/_32/pscrpt/inline-cpp/stringtype.map' contains the following single line (plus newline):
        string T_PV
        (Safest to provide a fully qualified path to the typemap file - though a path relative to the cwd should also work.)

        Cheers,
        Rob