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

时间:2010-09-28 07:58:49

标签: perl static object

我有一个用C编写的函数(在HelloWorld.c文件中说)。 我想编译它并需要创建一个staic目标文件HelloWorld.a

最后,我需要从Perl程序(HelloWorld.pl)调用它。

3 个答案:

答案 0 :(得分:9)

要从perl调用C,通常从他的c代码编译共享的,而不是静态的库,然后使用XSLoaderDynaLoader模块将其加载到perl解释器中。

然后能够从perl空间调用C代码有很多方法。最常见的是编写一个名为XSUB的东西,它有一个perl端接口,将perl调用约定映射到C调用约定,并调用C函数。这些XSUB通常也链接到将被加载到perl中的共享库,并使用称为XS的语言编写,该文档在perlxsperlxstut中有详细记录。

还有其他方法来构建包装层,如各种XS代码生成器以及SWIG。但您也可以使用NCI直接调用C函数。 Perl也有很多。 P5NCI就是其中一个例子,今年的Google Summer of Code计划开发的ctypes模块是另一个。

这里应该提到的另一个相关技术是Inline::C,以及Inline系列的其他模块。它们允许您直接在perl中编写其他语言的代码,并调用它。 Inline :: C只是构建XS代码并将其结果加载到解释器中。

答案 1 :(得分:3)

正如@rafl所说,你应该使用共享库。

如果必须使用静态库,则必须使用内置的静态库重建Perl。您还需要一些XS粘合剂。但是,这很麻烦,你真的,真的不想这样做。

答案 2 :(得分:2)

根据perlxstut

  

通常认为,如果系统无法动态加载库,则无法构建XSUB。这是不正确的。您可以构建它们,但必须将XSUB子程序与Perl的其余部分链接,从而创建一个新的可执行文件。这种情况类似于Perl 4.

     

本教程仍可用于此类系统。 XSUB构建机制将检查系统并在可能的情况下构建可动态加载的库,或者是静态库,然后可选地,链接到该静态库的新静态链接可执行文件。

     

如果您希望在可以动态加载库的系统上构建静态链接的可执行文件,您可以在以下所有示例中执行不带参数的命令“make”,运行命令“make perl”而不是。

     

如果您已经选择生成了这样一个静态链接的可执行文件,那么您应该说“make test”,而不是说“make test_static”。在根本无法构建可动态加载的库的系统上,只需说“make test”即可。