2015-02-17 2 views
4

Пытается использовать структуру данных perl (частично как способ поддержки ассоциативного массива на C), но следующая программа продолжает сбой. Он компилируется отлично, но будет сбой на линии с помощью newSVpv(). Не знаю, почему.Программа C продолжает сбой при вызове функции perl newSVpv()

#include <EXTERN.h>    /* from the Perl distribution  */ 
#include <perl.h>     /* from the Perl distribution  */ 
static PerlInterpreter *my_perl; /*** The Perl interpreter ***/ 
int main(int argc, char **argv, char **env) { 
    char *proto = "http"; 
    SV* ret = newSVpv("http", 4); 
    sv_catpvn(ret, "://", 3); 
    STRLEN len = 1; 
    char *result = SvPV(ret, len); 
    printf("result: %p %d\n", result, len); 
    return 0; 
} 

Линия скомпилировать это

gcc -g -o interp te1.c `perl -MExtUtils::Embed -e ccopts -e ldopts` 

The Perl у меня есть 5.14.2 работает на Ubuntu 12.04.4 LTS.

Спасибо за любые советы!

UPDATE: добавлен след gdb. Спасибо за вопрос. GDB след:

Program received signal SIGSEGV, Segmentation fault. 
0x00007ffff7b235a6 in Perl_newSVpv() from /usr/lib/libperl.so.5.14 
(gdb) bt 
#0 0x00007ffff7b235a6 in Perl_newSVpv() from /usr/lib/libperl.so.5.14 
#1 0x0000000000400927 in main (argc=1, argv=0x7fffffffe1e8, 
    env=0x7fffffffe1f8) at te1.c:7 
(gdb) 
+0

Как он падает? Сообщения об ошибках, и, если возможно, поможет backdrace gdb. – hobbs

ответ

7

Я обычно вызов C из Perl, а не Perl из C, но я уверен, что ваша проблема в том, что вы не скопировали PERL_SYS_INIT3, perl_alloc и perl_construct бит от perlembed example и поэтому у вас на самом деле нет структуры интерпретатора perl для работы. newSVpv бомбардирует, когда пытается получить доступ к чему-то через несуществующий указатель интерпретатора.

Последние три строки этого примера (perl_destruct, perl_free и PERL_SYS_TERM) также должны быть названы в конце вашей программы в соответствии с передовой практикой.

+0

Спасибо, это работает! – packetie

Смежные вопросы