内容

名称

ExtUtils::Embed - 在 C/C++ 应用程序中嵌入 Perl 的实用程序

概要

perl -MExtUtils::Embed -e xsinit 
perl -MExtUtils::Embed -e ccopts 
perl -MExtUtils::Embed -e ldopts 

描述

ExtUtils::Embed 提供了在您的 C/C++ 应用程序中嵌入 Perl 解释器和扩展的实用程序函数。通常,应用程序的 Makefile 会在构建应用程序时调用 ExtUtils::Embed 函数。

@EXPORT

ExtUtils::Embed 导出以下函数

xsinit(), ldopts(), ccopts(), perl_inc(), ccflags(), ccdlflags(), xsi_header(), xsi_protos(), xsi_body()

函数

xsinit()

生成 XS 初始化函数的 C/C++ 代码。

当以 `perl -MExtUtils::Embed -e xsinit --` 的形式调用时,会识别以下选项

-o <输出文件名> (默认值为 perlxsi.c)

-o STDOUT 将打印到 STDOUT。

-std (为与当前 Perl 链接的扩展编写代码。)

任何其他参数都应为要生成代码的模块的名称。

当使用参数调用时,会接受以下参数,这些参数是可选的

xsinit($filename,$std,[@modules])

其中,

$filename 等效于 -o 选项。

$std 是布尔值,等同于 -std 选项。

[@modules] 是一个数组引用,与上面提到的附加参数相同。

示例
perl -MExtUtils::Embed -e xsinit -- -o xsinit.c Socket

这将生成包含 xs_init 函数的代码,该函数将 Perl 的 Socket::bootstrap 函数与 C 的 boot_Socket 函数粘合在一起,并将代码写入名为 xsinit.c 的文件。

请注意,DynaLoader 是一个特殊情况,它必须直接调用 boot_DynaLoader

perl -MExtUtils::Embed -e xsinit

这将生成用于与 DynaLoader 以及 $Config{static_ext} 中找到的每个静态扩展链接的代码。代码将写入默认文件名 perlxsi.c

perl -MExtUtils::Embed -e xsinit -- -o xsinit.c \
                           -std DBI DBD::Oracle

在这里,代码将为所有当前链接的扩展以及 DBIDBD::Oracle 的代码编写。

如果您有一个可用的 DynaLoader,那么很少需要静态链接任何其他扩展。

ldopts()

用于将 Perl 库和扩展链接到您的应用程序的输出参数。

当以 `perl -MExtUtils::Embed -e ldopts --` 的形式调用时,将识别以下选项

-std

用于将 Perl 库和任何与当前 Perl 链接的扩展链接的输出参数。

-I <path1:path2>

ModuleName.a 档案的搜索路径。默认路径是 @INC。预计库档案将被找到为 /some/path/auto/ModuleName/ModuleName.a 例如,当查找相对于搜索路径的 Socket.a 时,我们应该找到 auto/Socket/Socket.a

当查找相对于搜索路径的 DBD::Oracle 时,我们应该找到 auto/DBD/Oracle/Oracle.a

请记住,您始终可以提供 /my/own/path/ModuleName.a 作为附加的链接器参数。

-- <链接器参数列表>

要考虑的附加链接器参数。

-- 标记之前找到的任何附加参数都应被视为要为其生成代码的模块名称。

当使用参数调用时,会接受以下参数,这些参数是可选的

ldopts($std,[@modules],[@link_args],$path)

其中

$std 是布尔值,等同于 -std 选项。

[@modules] 等同于在 -- 标记之前找到的附加参数。

[@link_args] 等同于 -- 标记后的参数。

$path 等同于 -I 选项。

此外,当 ldopts 被调用并带有参数时,它将返回参数字符串,而不是将其打印到 STDOUT。

示例
perl -MExtUtils::Embed -e ldopts

这将打印与 libperl 和在 $Config{static_ext} 中找到的扩展链接的参数。这包括在 $Config{libs} 中找到的库,以及通过搜索 @INC-I 选项指定的路径找到的每个扩展的第一个 ModuleName.a 库。此外,当找到 ModuleName.a 时,将从同一目录中的 extralibs.ld 文件中获取额外的链接器参数。

perl -MExtUtils::Embed -e ldopts -- -std Socket

这将与上面的示例执行相同的操作,并打印与 Socket 扩展链接的额外参数。

perl -MExtUtils::Embed -e ldopts -- -std Msql -- \
                       -L/usr/msql/lib -lmsql

第二个 '--' 标记后的任何参数都是额外的链接器参数,将检查其是否存在潜在冲突。如果没有冲突,这些额外参数将成为输出的一部分。

perl_inc()

为了包含 Perl 头文件,此函数只打印

-I$Config{archlibexp}/CORE  

所以,与其说

perl -MConfig -e 'print "-I$Config{archlibexp}/CORE"'

只需说

perl -MExtUtils::Embed -e perl_inc
ccflags(), ccdlflags()

这些函数只打印 $Config{ccflags} 和 $Config{ccdlflags}

ccopts()

此函数将 perl_inc()ccflags()ccdlflags() 合并为一个。

xsi_header()

此函数只返回一个字符串,该字符串定义与 perlmain.c 相同的 EXTERN_C 宏,以及 #include perl.hEXTERN.h

xsi_protos(@modules)

此函数返回每个 @modules 的 boot_$ModuleName 原型的字符串。

xsi_body(@modules)

此函数返回对 newXS() 的调用字符串,这些调用将模块 bootstrap 函数粘合到每个 @modules 的 boot_ModuleName

xsinit() 使用 xsi_* 函数生成大部分代码。

示例

有关如何使用 ExtUtils::Embed 构建带有嵌入式 Perl 的 C/C++ 应用程序的示例,请参阅 perlembed

另请参阅

perlembed

作者

Doug MacEachern <[email protected]>

基于 Tim Bunce <[email protected]> 和 Andreas Koenig <[email protected]> 以及 Tim Bunce 的 minimod.pl 的想法。