微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何告诉 MakeMaker 准确添加我想要的库?

如何解决如何告诉 MakeMaker 准确添加我想要的库?

我正在使用 XS 创建一个使用 C 库的 Perl 模块。

出于测试目的,我创建了一个测试库,它有两个简单的功能

void kzA()  (does a simple printf)
void kzB(int i,char *str) (does a printf of the received parameters)

我还在 XS 中创建了一些胶水,以便现在访问 kzA() 函数: (我只展示了函数本身,但包含也在 XS 中)

void
ka()
    CODE:
        printf("Before kzA()\n");
        kzA();
        printf("After kzA()\n");

因此,我将测试库编译为 fc.so,它与我的 xs 文件和我的 Makefile.PL (/workspace/LirePivots) 位于同一目录中

在我的 Makefile.PL 中,我将 LIBS 键设置为 ['-L/workspace/LirePivots -l:fc.so'],但是当使用 perl (perl Makefile.PL) 执行它时,它显示“警告(几乎无害):没有找到 -l:fc.so 的库” 然后它编写一个没有提到所述库的 Makefile。然后,在编译(使用“make”)和安装(使用“sudo make install”)之后,当我运行从我的模块调用 ka() 函数的测试脚本时,我得到了“before”行,但是 kzA () 函数没有被调用,很明显,因为它找不到 kzA 符号,程序停在那里。

创建一个 C 测试程序,我将使用相同的参数链接(-l:fc.so -L/workspace/LirePivots)确实 工作,而且,只要我把路径在 LD_LIBRARY_PATH 中,它找到该函数并正确运行它。

我也尝试重命名库 libfc.so,并将 -l 部分更改为“-lfc”,但它也不起作用。它永远找不到图书馆。

有人知道我做错了什么吗?

编辑: 根据要求,我创建了一个最小示例:https://github.com/kzwix/xsTest 要运行它,您需要有一个装有 Perl 5 的 Linux 以及 XS(Redhat 上的 perl-devel 包)。还有一个 C 编译器,当然还有 make。

解决方法

好吧,我还是不知道它为什么找不到图书馆的原因。但我找到了一个解决方法:

通过将测试库作为“libfc.so”添加到 /usr/lib,然后运行“sudo ldconfig”,库被添加到缓存中(当命名为 fc.so 时,即使在 /usr/lib 中,ldconfig 不会添加它。此外,它也不适用于符号链接,我不得不将其复制到那里)。

将库添加到缓存后,“perl Makefile.PL”仍然找不到该库。除了“-lfc”之外,我还必须使用“-L/usr/lib”才能最终找到库,并“同意”将参数添加到库的链接步骤中。

发生这种情况后,我可以使用“make”进行编译,并且执行测试程序确实按预期工作(我看到了“之前”和“之后”printf,我看到了 kzA 中的函数() 函数来自 libfc.so)

感谢 Håkon Hægland 的帮助。

(我无法提供 Dockerfile,它们链接到我组织内部的图像,我不允许共享)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。