Hi, I am trying to create Perl subroutine in my C++ program, source code of which is given below -- attempt to embed Perl in C++ program. I cannot use the perl script file for this because the expressions to be evaluated are stored in database & are to be loaded at runtime.
This program compiles fine. Command line for that is also given. But, program crashes when it calls perl_eval_pv function. When I ran it in GDB, I got this back trace. May I please know: 1) Is this correct way to create Perl subroutines in embedded Perl in C? 2) Why is this program is crashing when perl_eval_pv? A) How to resolve this problem of crash? -- should I link any more library or compile the Perl on my machine? Please help. Thanks in advance for help & guidance. Regards, Ganesh Compilation command: g++ -g3 -ggdb -Dbool=char -DHAS_BOOL -I/usr/lib/perl5/5.8.0/i386-linux-thread-multi/CORE -L/usr/lib/perl5/5.8.0/i386-linux-thread-multi/CORE -L/usr/lib -L. -lperl -lm -lnsl -lgdbm -ldb -ldl -lpthread -lc -lcrypt -lutil testeval.cpp rpm -qf /usr/bin/perl perl-5.8.0-88.4 Program source code: #include <EXTERN.h> #include <perl.h> static PerlInterpreter *my_perl; main() { my_perl = perl_alloc(); perl_construct(my_perl); char peExpr[] =\ "sub isSizeSmall($size,$vol,$ADV,$prod)\n"\ "{\n"\ " my ($size,$vol,$ADV,$prod) = @_;\n"\ " if ( ($size < 1000) && ($vol < (0.001 * $ADV)) && ($prod =~ m/Stock/)){\n"\ " return 10;\n"\ " } else {\n"\ " return 11;\n"\ " }\n"\ "}\n"; printf("expression: \n[%s]\n",peExpr); // Parse this subroutine & add to interpreter perl_eval_pv(peExpr,TRUE); // now call this subroutine with 4 input arguments in an array char *peArgs[] = { "100","1000","100000","\"Stock\""}; perl_call_argv("isSizeSmall",G_ARRAY,peArgs); perl_destruct(my_perl); perl_free(my_perl); } Gdb backtrace output when the program got SIGSEGV: LD_LIBRARY_PATH=/usr/lib/perl5/5.8.0/i386-linux-thread-multi/CORE:$LD_LIBRARY_PATH Using host libthread_db library "/lib/tls/libthread_db.so.1". (gdb) run Starting program: /home/gborse/prgs/bakup/perl/a.out [Thread debugging using libthread_db enabled] [New Thread -1223159680 (LWP 23628)] expression: [sub isSizeSmall($size,$vol,$ADV,$prod) { my ($size,$vol,$ADV,$prod) = @_; if ( ($size < 1000) && ($vol < (0.001 * $ADV)) && ($prod =~ m/Stock/)){ return 10; } else { return 11; } }] Program received signal SIGSEGV, Segmentation fault. [Switching to Thread -1223159680 (LWP 23628)] 0xb757fa90 in S_doeval (my_perl=0x8049c48, gimme=0, startop=0x0) at pp_ctl.c:2774 2774 pp_ctl.c: No such file or directory. in pp_ctl.c Current language: auto; currently c (gdb) bt #0 0xb757fa90 in S_doeval (my_perl=0x8049c48, gimme=0, startop=0x0) at pp_ctl.c:2774 #1 0xb7581412 in Perl_pp_entereval (my_perl=0x8049c48) at pp_ctl.c:3353 #2 0xb74e678f in S_call_body (my_perl=0x8049c48, myop=0xbfffa370, is_eval=1) at perl.c:2064 #3 0xb74e69d2 in Perl_eval_sv (my_perl=0x8049c48, sv=0x0, flags=0) at perl.c:2129 #4 0xb74e6c1a in Perl_eval_pv (my_perl=0x8049c48, p=0x0, croak_on_error=1) at perl.c:2188 #5 0x08048804 in main () at testeval.cpp:31 (gdb) //------------------------------------------------------------------------------------------------- ============================================================================== Please access the attached hyperlink for an important electronic communications disclaimer: http://www.credit-suisse.com/legal/en/disclaimer_email_ib.html ==============================================================================