【问题标题】:Building a perl extension module on OpenBSD在 OpenBSD 上构建 perl 扩展模块
【发布时间】:2013-05-23 03:38:54
【问题描述】:

当必需的.so 文件丢失时,我应该如何在 OpenBSD 上构建 XS perl 模块?

背景:在普通 OpenBSD 5.3 vm 安装中,我无法构建需要链接到 -lpthread 的 perl 模块。 pthread.a 和 pthread.so.Maj.Min 确实 存在于系统中。

但是 Makefile.PL 正在寻找 pthread.so,但它不存在。这对于 OpenBSD 来说很普通吗? (我可以强制 Makefile 链接到 pthread.a 并且一切正常,因为它发生了。)

在类似 Redhat 的 Linux 环境中,我只需安装正确的 -devel RPM 并再次运行。然而,在 OpenBSD 上,我缺少一些关于开发环境的基本知识。

更新核心问题是 Dynaloader 错误检测 Makefile.PL 中的库。

【问题讨论】:

    标签: perl openbsd perl-xs


    【解决方案1】:

    Makefile 错误,向上游报告错误。它永远不应该寻找特定的文件。看这个例子:

    $ cat test.c              
    int main(){
        return 0;
    }
    $ gcc -lpthread -o test test.c
    $ ldd test
    test:
        Start            End              Type Open Ref GrpRef Name
        00000c4321600000 00000c4321a02000 exe  1    0   0      test
        00000c4521f63000 00000c4522374000 rlib 0    2   0      /usr/lib/libpthread.so.17.1
        00000c4524c1c000 00000c4525103000 rlib 0    1   0      /usr/lib/libc.so.68.2
        00000c452a100000 00000c452a100000 rtld 0    1   0      /usr/libexec/ld.so
    

    此外,在 OpenBSD 中,您不需要安装 -devel 软件包。 OpenBSD 包含电池。

    【讨论】:

    • 是的;还有其他问题 - Dynaloader 对损坏的库进行魔法检测。足够接近。
    【解决方案2】:

    虽然编辑 Makefile.PL 是一种方法,但我通常看到人们使用链接文件将通用库/可执行文件名称指向特定于版本的名称。

    For Example:
        pthread.so -> pthread.so.maj.min
        pthread.so.maj -> pthread.so.maj.min
    

    这样,想要“最新”版本的东西可以通过链接获得它,并且认为只关心主要版本的东西可以获取其主要版本的最新版本...

    【讨论】:

    • 是的,但这不是这类事情的标准做法。您将如何针对 pthread 动态编译用户程序——每次都手动创建正确的符号链接?这似乎不正确。
    • 对我来说似乎也不正确。我通常看到它是由 Distro Vendor/Package Author/Makefile 完成的。不能说这是否是一个好主意,只是报告我所看到的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多