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 建置需求。那會是一個更宏偉的目標!
傳回新的 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 );
如果目前的系統有可用的 C 編譯器和連結器,則傳回 true,否則傳回 false。為確定這一點,我們實際上會編譯和連結範例 C 函式庫。範例會在系統暫存目錄中編譯,或者如果因為某些原因而失敗,則在目前目錄中編譯。
就像 have_compiler,但使用 C++ 而不是 C。
編譯 C 原始檔並產生物件檔。傳回物件檔的名稱。原始檔會在必要的 source
參數中指定;下面列出的其他參數是選用的。
object_file
指定要建立的輸出檔名稱。否則會諮詢 object_file()
方法,傳遞 source
檔的名稱給它。
include_dirs
指定要搜尋標頭檔的任何其他目錄。可以字串表示單一目錄,或以清單參考表示多個目錄。
extra_compiler_flags
指定要傳遞給編譯器的任何其他引數。應以清單參考包含個別引數,或者如果這不可行,則以字串包含所有引數。
C++
指定原始檔是 C++ 原始檔,並設定適當的編譯器旗標
此方法的運作也會受到 Config.pm
中的 archlibexp
、cccdlflags
、ccflags
、optimize
和 cc
條目的影響。
呼叫連結器以從物件檔產生函式庫檔。在純量環境中,傳回函式庫檔的名稱。在清單環境中,傳回函式庫檔和建立的任何暫存檔。必要的 objects
參數包含要處理的物件檔名稱,字串(一個物件檔)或清單參考(一個或多個檔)。下列參數是選用的
指定要建立的輸出函式庫檔名稱。否則會諮詢 lib_file()
方法,傳遞 objects
中第一個條目的名稱給它。
指定連結會建立的 Perl 模組名稱。在需要進行預先連結的平台(Win32、OS/2 等)上,這是必要的參數。
您希望傳遞給連結器的任何其他旗標。
在 need_prelink()
傳回 true 的平台上,prelink()
會自動呼叫。
此方法的運作也會受到 Config.pm
中的 lddlflags
、shrpenv
和 ld
項目影響。
呼叫連結器以從物件檔案產生可執行檔案。在純量內容中,會傳回可執行檔案的名稱。在清單內容中,會傳回可執行檔案和任何建立的暫時檔案。必要的 objects
參數包含要處理的物件檔案名稱,以字串(一個物件檔案)或清單參考(一個或多個檔案)表示。選用參數與 link
相同,但下列例外
指定要建立的輸出可執行檔案名稱。否則會諮詢 exe_file()
方法,傳遞 objects
中第一個項目的名稱給它。
my $object_file = $b->object_file($source_file);
將 C 原始檔名稱轉換為從中建立的最自然輸出物件檔名稱。例如,在 Unix 上,原始檔 foo.c 會產生物件檔 foo.o。
my $lib_file = $b->lib_file($object_file);
將物件檔名稱轉換為從中建立的最自然輸出函式庫檔名稱。例如,在 Mac OS X 上,物件檔 foo.o 會產生函式庫檔 foo.bundle。
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)