给定一个使用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
的参数中设置的包含位置、库列表等。如果我开始手动编写规则,我必须至少考虑make
、dmake
和nmake
。如果使用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正确粘合在一起所需的东西。