内容

名称

ExtUtils::CBuilder - 为 Perl 模块编译和链接 C 代码

概要

use ExtUtils::CBuilder;

my $b = ExtUtils::CBuilder->new(%options);
$obj_file = $b->compile(source => 'MyModule.c');
$lib_file = $b->link(objects => $obj_file);

说明

此模块可以通过跨平台方式调用适当的编译器和链接器来构建 Perl 模块的 C 部分。它的灵感来自 Module::Build 项目,但也可以用于其他目的。但是,它并非旨在作为所有 C 构建需求的通用跨平台接口。那将是一个更为宏伟的目标!

方法

new

返回一个新的 ExtUtils::CBuilder 对象。config 参数允许你覆盖对象执行的所有操作的 Config.pm 设置,如下例所示

# Use a different compiler than Config.pm says
my $b = ExtUtils::CBuilder->new( config =>
                                 { ld => 'gcc' } );

quiet 参数告诉 CBuilder 在执行 system() 命令之前不要打印这些命令

# Be quieter than normal
my $b = ExtUtils::CBuilder->new( quiet => 1 );
have_compiler

如果当前系统具有可用的 C 编译器和链接器,则返回 true,否则返回 false。为了确定这一点,我们实际上会编译并链接一个示例 C 库。该示例将在系统临时目录中编译,或者如果出于某种原因失败,则在当前目录中编译。

have_cplusplus

类似于 have_compiler,但针对 C++ 而不是 C。

compile

编译 C 源文件并生成目标文件。返回目标文件的名称。源文件在必需的 source 参数中指定;下面列出的其他参数是可选的。

object_file

指定要创建的输出文件的名称。否则,将参考 object_file() 方法,并向其传递 source 文件的名称。

include_dirs

指定在其中搜索头文件的任何其他目录。可以作为指示单个目录的字符串,或作为指示多个目录的列表引用。

extra_compiler_flags

指定要传递给编译器的任何其他参数。应该作为包含各个参数的列表引用提供,或者如果不可能,则作为包含所有参数的字符串提供。

C++

指定源文件是 C++ 源文件并设置适当的编译器标志

此方法的操作还受 Config.pm 中的 archlibexpcccdlflagsccflagsoptimizecc 条目的影响。

调用链接器以从目标文件生成库文件。在标量上下文中,返回库文件的名称。在列表上下文中,返回库文件和创建的任何临时文件。必需的 objects 参数包含要处理的目标文件的名称,可以是字符串(对于一个目标文件)或列表引用(对于一个或多个文件)。以下参数是可选的

lib_file

指定要创建的输出库文件的名称。否则,将参考 lib_file() 方法,并向其传递 objects 中第一个条目的名称。

module_name

指定将通过链接创建的 Perl 模块的名称。在需要进行预链接的平台(Win32、OS/2 等)上,这是一个必需的参数。

extra_linker_flags

您希望传递给链接器的任何其他标志。

need_prelink() 返回 true 的平台上,将自动调用 prelink()

此方法的操作还受 Config.pm 中的 lddlflagsshrpenvld 条目的影响。

调用链接器以从对象文件中生成可执行文件。在标量上下文中,将返回可执行文件的文件名。在列表上下文中,将返回可执行文件和创建的任何临时文件。必需的 objects 参数包含要处理的对象文件的文件名,可以是字符串(对于一个对象文件)或列表引用(对于一个或多个文件)。可选参数与 link 相同,但 exe_file 除外。

exe_file

指定要创建的输出可执行文件的文件名。否则,将咨询 exe_file() 方法,并向其传递 objects 中第一个条目的名称。

object_file
my $object_file = $b->object_file($source_file);

将 C 源文件的文件名转换为从中创建的最自然的输出对象文件的文件名。例如,在 Unix 上,源文件 foo.c 将生成对象文件 foo.o

lib_file
my $lib_file = $b->lib_file($object_file);

将对象文件的文件名转换为从中创建的最自然的输出库文件的文件名。例如,在 Mac OS X 上,对象文件 foo.o 将生成库文件 foo.bundle

exe_file
my $exe_file = $b->exe_file($object_file);

将对象文件的文件名转换为从中创建的最自然的可执行文件的文件名。例如,在 Mac OS X 上,对象文件 foo.o 将生成可执行文件 foo,在 Windows 上,它将生成 foo.exe

在 Win32、OS/2、VMS 和 AIX 等某些平台上,在调用链接器之前执行一些操作是必要的。ExtUtils::Mksymlists 模块执行此操作,编写在动态扩展的共享库创建期间链接器使用的文件。将以列表形式返回任何已写文件的文件名。

几个参数对应于 ExtUtils::Mksymlists::Mksymlists() 选项,如下所示

 Mksymlists()   prelink()          type
-------------|-------------------|-------------------
 NAME        |  dl_name          | string (required)
 DLBASE      |  dl_base          | string
 FILE        |  dl_file          | string
 DL_VARS     |  dl_vars          | array reference
 DL_FUNCS    |  dl_funcs         | hash reference
 FUNCLIST    |  dl_func_list     | array reference
 IMPORTS     |  dl_imports       | hash reference
 VERSION     |  dl_version       | string

请参阅 ExtUtils::Mksymlists 的文档以了解这些参数的作用的详细信息。

在链接期间应调用 prelink() 的平台上返回 true,否则返回 false。

返回要提供给链接命令的额外参数列表;这些参数与 prelink() 相同,另外还增加了对 prelink() 结果的数组引用;此引用由键 prelink_res 索引。

待办事项

目前,此操作仅在 Unix 上经过测试,并且不包含 Module::Build 项目中的任何特定于 Windows 的代码。我接下来会进行此操作。

历史记录

此模块是 Module::Build 项目的衍生产品,该项目有许多贡献者。值得注意的是,Randy W. Sims 提交了许多代码来支持 Windows 上的 3 个编译器,并帮助解决了其他各种特定于平台的问题。Ilya Zakharevich 为 OS/2 贡献了修复程序;John E. Malmberg 和 Peter Prymmer 为 VMS 做出了同样的贡献。

支持

ExtUtils::CBuilder 作为 Perl 5 核心的一部分进行维护。请通过 Perl 5 附带的 perlbug 工具提交任何错误报告。错误报告将包含在 https://rt.perl.org 上的 Perl 5 工单系统中。

Perl 5 源代码可在 https://perl5.git.perl.org/perl.git 获得,ExtUtils-CBuilder 可以在存储库的 dist/ExtUtils-CBuilder 目录中找到。

作者

Ken Williams,[email protected]

Perl 5 Porters 的其他贡献。

版权

版权所有 (c) 2003-2005 Ken Williams。保留所有权利。

此库是免费软件;您可以在与 Perl 本身相同的条款下重新分发和/或修改它。

另请参见

perl(1),Module::Build(3)