Совместное использование функций C между двумя модулями XS Perl - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть модуль Perl A, который является модулем на основе XS. У меня есть файл A.xs и файл aux_A.c, где у меня есть некоторые стандартные функции C. Я использую DynaLoader, и это работает файл.

Теперь у меня есть новый модуль B, который также является модулем XS. У меня также есть файл B.xs и файл aux_B.c. Теперь я хочу, чтобы стандартная функция C, определенная в файле aux_B.c, могла использовать функцию, определенную в файле aux_A.c.

Один из вариантов - заставить модуль A создать стандартную библиотеку C и связать модуль B с ней. Но я пытался уйти от этого варианта.

Есть ли другой способ пойти?

В настоящее время я получаю жалобу DynaLoader на неопределенный символ при попытке загрузить библиотеку B.so.

Спасибо Alberto

1 Ответ

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

Чтобы модуль A экспортировал свои символы C с DynaLoader, необходимо добавить следующее к A.pm:

sub dl_load_flags { 1 }

К сожалению, это плохо документировано. См. эту тему в PerlMonks и исходный код DynaLoader для получения более подробной информации. Эффект флага заключается в установке RTLD_GLOBAL при загрузке A.so с dlopen, что делает его символы доступными для других общих объектов.

...