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
函数。
ExtUtils::Embed
导出以下函数
xsinit(), ldopts(), ccopts(), perl_inc(), ccflags(), ccdlflags(), xsi_header(), xsi_protos(), xsi_body()
生成 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
在这里,代码将为所有当前链接的扩展以及 DBI
和 DBD::Oracle
的代码编写。
如果您有一个可用的 DynaLoader
,那么很少需要静态链接任何其他扩展。
用于将 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 头文件,此函数只打印
-I$Config{archlibexp}/CORE
所以,与其说
perl -MConfig -e 'print "-I$Config{archlibexp}/CORE"'
只需说
perl -MExtUtils::Embed -e perl_inc
这些函数只打印 $Config{ccflags} 和 $Config{ccdlflags}
此函数将 perl_inc()
、ccflags()
和 ccdlflags()
合并为一个。
此函数只返回一个字符串,该字符串定义与 perlmain.c 相同的 EXTERN_C
宏,以及 #include perl.h 和 EXTERN.h。
此函数返回每个 @modules 的 boot_$ModuleName
原型的字符串。
此函数返回对 newXS()
的调用字符串,这些调用将模块 bootstrap 函数粘合到每个 @modules 的 boot_ModuleName。
xsinit()
使用 xsi_* 函数生成大部分代码。
有关如何使用 ExtUtils::Embed
构建带有嵌入式 Perl 的 C/C++ 应用程序的示例,请参阅 perlembed。
Doug MacEachern <[email protected]
>
基于 Tim Bunce <[email protected]
> 和 Andreas Koenig <[email protected]
> 以及 Tim Bunce 的 minimod.pl 的想法。