8

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

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

4

2 回答 2

2

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

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

于 2014-09-01T20:36:53.347 回答
1

你可能想看看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,就可以构建一个Makefile处理 C 和 XS 的程序,并将它们链接在一起以用于 Perl。

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

于 2015-08-17T19:50:47.280 回答