如何将静态C对象文件链接到Perl?
我有一个用C编写的函数(比如HelloWorld.C文件)。 我想编译它,需要创建一个staic对象文件HelloWorld.a如何将静态C对象文件链接到Perl?,perl,static,object,Perl,Static,Object,我有一个用C编写的函数(比如HelloWorld.C文件)。 我想编译它,需要创建一个staic对象文件HelloWorld.a 最后,我需要从一个Perl程序(HelloWorld.pl)调用它。要从Perl调用C,一个人通常从他的C代码编译一个共享的,而不是静态的库,然后使用XSLoader或DynaLoader模块将其加载到Perl解释器中 为了能够从perl空间调用C代码,有很多方法。最常见的是编写一个名为XSUBs的东西,它有一个perl端接口,将perl调用约定映射到C调用约定,并调
最后,我需要从一个Perl程序(HelloWorld.pl)调用它。要从Perl调用C,一个人通常从他的C代码编译一个共享的,而不是静态的库,然后使用
XSLoader
或DynaLoader
模块将其加载到Perl解释器中
为了能够从perl空间调用C代码,有很多方法。最常见的是编写一个名为XSUB
s的东西,它有一个perl端接口,将perl调用约定映射到C调用约定,并调用C函数。这些XSUB通常也链接到共享库中,该库将加载到perl中,并用一种称为XS的语言编写,该语言在和中有大量的文档记录
还有其他方法来构建包装层,比如各种XS代码生成器以及SWIG。但是您也可以使用NCI
直接调用C函数。Perl也有许多这样的功能。P5NCI
就是其中的一个例子,在今年的谷歌代码之夏计划中开发的ctypes模块就是另一个例子
这里可能应该提到的另一个相关技术是
Inline::C
,以及Inline系列的其他模块。它们允许您直接用perl编写其他语言的代码,并调用它。Inline::C只是构建XS代码并将其结果加载到解释器中。正如@rafl所说,您应该使用一个共享库
如果必须使用静态库,则必须使用内置的静态库重建Perl。你也需要一些XS胶水。然而,这已经够麻烦的了,你真的,真的不想这么做。根据:
通常认为,如果系统不具备动态加载库的能力,则无法构建XSUBs。这是不正确的。您可以构建它们,但必须将XSUBs子例程与Perl的其余部分链接起来,从而创建一个新的可执行文件。这种情况类似于Perl4
本教程仍然可以在这样的系统上使用。XSUB构建机制将检查系统,并在可能的情况下构建一个动态可加载的库,或者构建一个静态库,然后(可选)构建一个新的静态链接可执行文件,其中链接了该静态库
如果您希望在可以动态加载库的系统上构建静态链接的可执行文件,在以下所有示例中,如果执行了不带参数的命令“make
”,则可以运行命令“make perl
”
如果您选择生成这样一个静态链接的可执行文件,那么您应该说“maketest
”,而不是说“maketest\u static
”。在根本无法构建动态可加载库的系统上,只需简单地说“maketest
”就足够了
如果您只想从perl运行一些C代码,只需将其编译为独立的C程序并在命令行上调用即可:)或者像gearman这样的东西可能会有所帮助。。