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



给定一个使用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,我无法找到一种直接的方法来指定要链接的库。

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

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

一个长期的解决方案是一个合适的编译框架,我一直在研究这个问题,但它并不平凡。

您可能需要查看Dist::Zilla。我用它是因为我永远都不记得该怎么做。通过一个相当小的样板dist.ini文件来告诉它要使用哪些插件,它将为您生成所有合适的构建系统,包括所有必要的Makefile.PL。把它想象成一个makefile制造商。我把它用于我的一个更小、更坏的基于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正确粘合在一起所需的东西。

相关内容

  • 没有找到相关文章

最新更新