Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Inline/C从Perl调用外部C函数(在共享库中)不起作用_C_Perl - Fatal编程技术网

使用Inline/C从Perl调用外部C函数(在共享库中)不起作用

使用Inline/C从Perl调用外部C函数(在共享库中)不起作用,c,perl,C,Perl,代码或多或少是从作者的页面中盗取的: 但没有给出预期的结果: use Inline C => Config => enable => autowrap => LIBS => "-lmylib "; use Inline C => <<'END_OF_C_CODE'; extern char *sharedFun(char *); void greet(char* name) { printf("H

代码或多或少是从作者的页面中盗取的: 但没有给出预期的结果:

use Inline C => Config =>
           enable => autowrap =>
           LIBS => "-lmylib ";
use Inline C => <<'END_OF_C_CODE';

extern char *sharedFun(char *);

void greet(char* name) {
  printf("Hello %s!\n", name);
}


char *func(char* name) {
  static char mystr[1024];
  char *p;

  strcpy(mystr, "string: ");
  p = sharedFun(name);
  strcpy(mystr, p);

  return(mystr);
}

END_OF_C_CODE

greet('Hello World');
greet(42);
$p = func("foobar");
print $p, "\n";
我用
strace
:共享库
libmylib进行了检查。因此不会搜索

为什么?

我认为库已被搜索,但未找到,因此符号未加载

从文档中,您可以提供到库的路径:
LIBS=>'-L/your/lib/path-lyourlib'

我发现了问题所在:所需的共享库必须存在于
perl inline.pl
第一次运行中(编译连接器时)。如果不存在,则以后将不再搜索:

$ perl inline.pl
Hello Hello World!
Hello 42!
/usr/home/guru/Perl/_Inline/lib/auto/inline_pl_8196/inline_pl_8196.so: Undefined symbol "sharedFun"
$ clang -shared -o libmylib.so mylib.c
$ ls -l libmylib.so
-rwxr-xr-x  1 guru  wheel  5546  4 nov.  22:23 libmylib.so
$ perl inline.pl
Hello Hello World!
Hello 42!
/usr/home/guru/Perl/_Inline/lib/auto/inline_pl_8196/inline_pl_8196.so: Undefined symbol "sharedFun"


$ rm -r _Inline
$ perl inline.pl
Hello Hello World!
Hello 42!
foobar

我们可以关闭此线程。

Tezrig正在处理一些问题。当我还没有创建
libmylib.so
文件时,我得到了相同的输出。另一个想法是设置你的
LD\u LIBRARY\u PATH
环境,这样它就可以找到你的
.so
文件。我对此进行了测试,它在这里工作得很好(无需设置LD\u LIBRARY\u PATH),在这里提出这个问题之前,我还尝试了
-L…
LD\u LIBRARY\u PATH
。真正的解决方案是:在第一次使用内联代码为脚本启动Perl之前创建共享库。
$ perl inline.pl
Hello Hello World!
Hello 42!
/usr/home/guru/Perl/_Inline/lib/auto/inline_pl_8196/inline_pl_8196.so: Undefined symbol "sharedFun"
$ clang -shared -o libmylib.so mylib.c
$ ls -l libmylib.so
-rwxr-xr-x  1 guru  wheel  5546  4 nov.  22:23 libmylib.so
$ perl inline.pl
Hello Hello World!
Hello 42!
/usr/home/guru/Perl/_Inline/lib/auto/inline_pl_8196/inline_pl_8196.so: Undefined symbol "sharedFun"


$ rm -r _Inline
$ perl inline.pl
Hello Hello World!
Hello 42!
foobar