Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将静态C对象文件链接到Perl?_Perl_Static_Object - Fatal编程技术网

如何将静态C对象文件链接到Perl?

如何将静态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调用约定,并调

我有一个用C编写的函数(比如HelloWorld.C文件)。 我想编译它,需要创建一个staic对象文件HelloWorld.a


最后,我需要从一个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这样的东西可能会有所帮助。。