【问题标题】:How to tell MakeMaker to add exactly the libraries I want?如何告诉 MakeMaker 添加我想要的库?
【发布时间】:2021-07-08 16:08:10
【问题描述】:

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

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

void kzA() (做一个简单的 printf) void kzB(int i, char *str) (对接收到的参数进行 printf 处理)

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

无效
K a()
    代码:
        printf("kzA()之前\n");
        kzA();
        printf("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(软件包 perl-devel,在 Redhat 上)。还有一个 C 编译器和 make,很明显。

【问题讨论】:

  • 这是哪个操作系统?你能上传一个完整的最小例子吗? GitHub?
  • 它在 Redhat Linux 上,它是一个容器,因为 /workspace 可以让您猜测。我们在我们的环境中使用 VSCode 和 Docker,但显然我很难为您提供完整的环境。
  • 根据要求,我创建了一个 GitHub 存储库:github.com/kzwix/xsTest
  • 我已添加two pull requests。使用这些 PR,我可以通过 test_module.pl 脚本运行 xsModule::ka()。我在 Ubuntu 21.04
  • this答案

标签: perl xs


【解决方案1】:

好的,我仍然不知道它找不到库的原因。但我找到了解决方法:

通过将测试库作为“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,它们链接到我组织内部的图像,我不允许共享)

【讨论】:

    猜你喜欢
    • 2015-12-14
    • 2021-08-10
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    相关资源
    最近更新 更多