c - 在两个 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
库时抱怨未定义的符号。
谢谢阿尔贝托
解决方案
要使模块 A 使用 导出其 C 符号DynaLoader
,您必须将以下内容添加到A.pm
:
sub dl_load_flags { 1 }
不幸的是,这没有得到很好的记录。有关更多详细信息,请参阅PerlMonks 上的此线程和DynaLoader
源代码。该标志的作用是RTLD_GLOBAL
在加载时A.so
设置dlopen
,使其符号可用于其他共享对象。
推荐阅读
- javascript - 有没有办法专门使用多维数组中的第二个值来进行计算
- javascript - for循环不执行js中的所有循环
- javascript - Rails 6 Actioncable 用户正在输入
- java - 将 XAMPP 控制面板包装到我的 java 应用程序中
- node.js - 在服务器创建文件以供下载时让客户端挂起
- apache-kafka - 当 KStream 拓扑中的自定义类中发生错误时,消费者偏移量会发生什么情况?
- node.js - JWT 解密加密令牌
- python - 重复数据删除库、阻塞问题、缺少匹配项
- linux - 为 Azure devops 服务器安装自托管 Linux 代理
- ios - 使用日历来获取确切的天数 Swift?