內容

名稱

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 函式。

@EXPORT

ExtUtils::Embed 匯出下列函式

xsinit()、ldopts()、ccopts()、perl_inc()、ccflags()、ccdlfags()、xsi_header()、xsi_protos()、xsi_body()

函式

xsinit()

產生 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

在此,會為所有目前連結的延伸模組以及 DBIDBD::Oracle 撰寫程式碼。

如果您有可運作的 DynaLoader,則很少需要在任何其他延伸模組中進行靜態連結。

ldopts()

輸出引數,用於將 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_inc()

對於包含 perl 標頭檔案,此函式僅列印

-I$Config{archlibexp}/CORE  

因此,與其說

perl -MConfig -e 'print "-I$Config{archlibexp}/CORE"'

不如說

perl -MExtUtils::Embed -e perl_inc
ccflags()、ccdlflags()

這些函式僅列印 $Config{ccflags} 和 $Config{ccdlflags}

ccopts()

此函式將 perl_inc()ccflags()ccdlflags() 合併為一個函式。

xsi_header()

此函式僅傳回一個字串,定義與 perlmain.c 相同的 EXTERN_C 巨集,並包含 perl.hEXTERN.h

xsi_protos(@modules)

此函式傳回每個 @modules 的 boot_$ModuleName 原型的字串。

xsi_body(@modules)

此函式傳回呼叫 newXS() 的字串,將模組 bootstrap 函式黏合到每個 @modules 的 boot_ModuleName

xsinit() 使用 xsi_* 函式來產生大部分的程式碼。

範例

有關如何使用 ExtUtils::Embed 來建置嵌入 perl 的 C/C++ 應用程式的範例,請參閱 perlembed

另請參閱

perlembed

作者

Doug MacEachern <dougm@osf.org>

根據 Tim Bunce <Tim.Bunce@ig.co.uk> 和 Andreas Koenig <k@anna.in-berlin.de> 和 Tim Bunce 的 minimod.pl 的想法。