Вызов внешней функции C (из разделяемой библиотеки) из Perl с Inline / C не работает - PullRequest
0 голосов
/ 02 ноября 2018

Код более или менее украден со страницы автора: https://metacpan.org/pod/distribution/Inline-C/lib/Inline/C/Cookbook.pod но не дает ожидаемых результатов:

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";

Результат выполнения:

nm libmylib.so | grep shared
000000000000056a T sharedFun
file libmylib.so
libmylib.so: ELF 64-bit LSB shared object, x86-64, version 1 (FreeBSD), dynamically linked, not stripped


$ perl inline.pl
Hello Hello World!
Hello 42!
/usr/home/guru/Perl/_Inline/lib/auto/inline_pl_9404/inline_pl_9404.so: Undefined symbol "sharedFun"

и я проверил с помощью strace: общая библиотека libmylib.so не ищется. Почему?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Я выяснил, в чем проблема: необходимая общая библиотека должна существовать при первом запуске из 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

Мы можем закрыть эту тему.

0 голосов
/ 02 ноября 2018

Я думаю, что библиотека ищется, но не найдена, и поэтому символы не загружаются.

Из документации вы можете указать путь к библиотеке: LIBS => '-L/your/lib/path -lyourlib';

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...