ExtUtils::Embed - 嵌入 Perl 至 C/C++ 應用程式的公用程式
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()、ccdlfags()、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}
中找到的函式庫和每個延伸模組的第一個 ModuleName.a 函式庫,該函式庫是透過搜尋 @INC
或由 -I 選項指定的路徑找到的。此外,當找到 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
巨集,並包含 perl.h 和 EXTERN.h。
此函式傳回每個 @modules 的 boot_$ModuleName
原型的字串。
此函式傳回呼叫 newXS()
的字串,將模組 bootstrap 函式黏合到每個 @modules 的 boot_ModuleName。
xsinit()
使用 xsi_* 函式來產生大部分的程式碼。
有關如何使用 ExtUtils::Embed
來建置嵌入 perl 的 C/C++ 應用程式的範例,請參閱 perlembed。
Doug MacEachern <dougm@osf.org
>
根據 Tim Bunce <Tim.Bunce@ig.co.uk
> 和 Andreas Koenig <k@anna.in-berlin.de
> 和 Tim Bunce 的 minimod.pl 的想法。