使用Perl的ExtUtils :: MakeMaker,如何使用与我的XS模块相同的设置编译可执行文件?

时间:2014-04-18 20:37:00

标签: c perl perl-xs makemaker

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

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

如果我执行以下操作

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

target$Config{obj_ext}: target.c

FRAG
}

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

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

2 个答案:

答案 0 :(得分:2)

EU :: MM不知道如何创建可执行文件。如果需要这样做,则需要考虑各种编译器工具链。我至少once已完成此操作,但我并不认为它完全可移植(只是便携式)。

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

答案 1 :(得分:1)

您可能需要查看Dist::Zilla。我使用它是因为我永远不会记得如何做到这一点。使用相当小的boilerplaty 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所需的内容做好。

相关问题