我有一个用C编写的函数(在HelloWorld.c文件中说)。 我想编译它并需要创建一个staic目标文件HelloWorld.a
最后,我需要从Perl程序(HelloWorld.pl)调用它。
答案 0 :(得分:9)
要从perl调用C,通常从他的c代码编译共享的,而不是静态的库,然后使用XSLoader
或DynaLoader
模块将其加载到perl解释器中。
然后能够从perl空间调用C代码有很多方法。最常见的是编写一个名为XSUB
的东西,它有一个perl端接口,将perl调用约定映射到C调用约定,并调用C函数。这些XSUB通常也链接到将被加载到perl中的共享库,并使用称为XS的语言编写,该文档在perlxs和perlxstut中有详细记录。
还有其他方法来构建包装层,如各种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
”即可。