內容

名稱

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() 方法,傳遞 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,kwilliams@cpan.org

Perl 5 Porters 的其他貢獻。

版權

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

此函式庫是自由軟體;您可以在與 Perl 相同的條款下重新散布或修改它。

另請參閱

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