首页 > 解决方案 > 在两个 XS Perl 模块之间共享 C 函数

问题描述

我有一个 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库时抱怨未定义的符号。

谢谢阿尔贝托

标签: cperllibrariesxs

解决方案


要使模块 A 使用 导出其 C 符号DynaLoader,您必须将以下内容添加到A.pm

sub dl_load_flags { 1 }

不幸的是,这没有得到很好的记录。有关更多详细信息,请参阅PerlMonks 上的此线程和DynaLoader源代码。该标志的作用是RTLD_GLOBAL在加载时A.so设置dlopen,使其符号可用于其他共享对象。


推荐阅读