给定一个使用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,我无法找到指定要链接的库的直接方法。
我一定错过了什么。如果你能指出来,我将不胜感激。
答案 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所需的内容做好。