【问题标题】:Using Perl's ExtUtils::MakeMaker, how can I compile an executable using the same settings as my XS module?使用 Perl 的 ExtUtils::MakeMaker,如何使用与 XS 模块相同的设置来编译可执行文件?
【发布时间】:2014-06-03 10:09:09
【问题描述】:

给定一个使用 C 库的 Perl XS 模块,假设有一个正确设置的 Makefile.PL,以便所有头文件和库位置、编译器和链接器标志等都能正常工作。

现在,假设我想包含一个带有所述 XS 模块的小型 C 程序,该模块使用相同的底层 C 库。指定目标可执行文件以便使用相同的设置和标志构建它的正确、独立于平台的方法是什么?

如果我执行以下操作

sub MY::postamble {
    return <<FRAG;
target$Config{exe_ext}: target$Config{obj_ext}

target$Config{obj_ext}: target.c

FRAG
}

我没有得到我在WriteMakefile 的参数中设置的位置、库列表等。如果我开始手动编写规则,我必须至少考虑makedmakenmake。如果使用ExtUtils::CBuilder,我想不出一个直接的方法来指定要链接的库。

我一定错过了什么。如果您能指出来,我将不胜感激。

【问题讨论】:

    标签: c perl perl-xs makemaker


    【解决方案1】:

    EU::MM 不知道如何创建可执行文件。如果需要这样做,则需要考虑各种编译器工具链。我至少已经做到了once,但我并没有声称它是完全便携的(只是足够便携)。

    一个长期的解决方案是一个合适的编译框架,我一直在努力,但它相当重要。

    【讨论】:

      【解决方案2】:

      您可能想查看Dist::Zilla。我使用它是因为我也不记得如何做到这一点。使用一个相当小且样板的dist.ini 文件告诉它要使用哪些插件,它将为您生成所有正确的构建系统,包括整个必要的Makefile.PL。把它想象成一个makefile-maker-maker。我将它用于我的一个更小、更损坏的基于 C 的 CPAN 模块:https://github.com/morungos/p5-Algorithm-Diff-Fast,它作为模块不是特别好用,但有一个不错的构建。所需的魔法在inc/DiffMakeMaker.pm 中。

      不过,简短的回答是查看此组件放入Makefile.PL 的额外设置:

      LIBS => [''],
      INC => '-I.',
      OBJECT => '$(O_FILES)', # link all the C files too
      

      只需将这些选项添加到您的Makefile.PL 中,它就可以构建一个处理 C 和 XS 的Makefile,并将它们链接在一起以用于 Perl。

      因为,虽然 EU::MM 不知道如何创建可执行文件,但它的大部分工作都是为了创建 Makefile。这非常高兴能够将 C 和 Perl 正确地粘合在一起。

      【讨论】:

        猜你喜欢
        • 2011-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-14
        • 2015-05-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多