簡體   English   中英

靜態編譯Python解釋器?

[英]Compile the Python interpreter statically?

我正在構建一個專用的嵌入式Python解釋器,並希望避免依賴於動態庫,所以我想用靜態庫編譯解釋器(例如libc.a而不是libc.so )。

我還想靜態鏈接屬於Python標准庫的所有動態庫。 我知道這可以使用Freeze.py來完成,但有沒有其他方法可以一步完成?

我發現了這個(主要是關於Python模塊的靜態編譯):

其中描述了用於配置的文件:

<Python_Source>/Modules/Setup

如果此文件不存在,可以通過復制創建:

<Python_Source>/Modules/Setup.dist

Setup文件中包含大量文檔,源代碼中包含的README提供了大量良好的編譯信息。

我還沒有嘗試編譯,但我認為有了這些資源,我嘗試時應該會成功。 我會在此發表評論結果。

更新

要獲得純靜態python可執行文件,還必須配置如下:

./configure LDFLAGS="-static -static-libgcc" CPPFLAGS="-static"

一旦你啟用這些標志構建,你可能會收到很多關於“重命名因為庫不存在”的警告。 這意味着您尚未正確配置Modules/Setup ,需要:

a)添加一行(靠近頂部),如下所示:

*static*

(這是星號/星號“靜態”和星號,沒有空格)

b)取消注釋您想要靜態可用的所有模塊(例如數學,數組等......)

您可能還需要添加特定的鏈接器標志(如上面發布的鏈接中所述)。 到目前為止,我的經驗是圖書館正在不加修改地工作。

運行make可能也有幫助,如下所示:

make 2>&1 | grep 'renaming'

這將顯示由於靜態鏈接而無法編譯的所有模塊。

CPython CMake Buildsystem提供了一種使用CMake構建Python的替代方法。

它可以靜態地構建python lib,並在該lib中包含您想要的所有模塊。 只需設置CMake的選項

BUILD_SHARED                     OFF
BUILD_STATIC                     ON

並設置要ONBUILTIN_<extension>

使用freeze並不會阻止在一次運行中完成所有操作(無論使用何種方法,您都需要多個構建步驟 - 例如,許多編譯器調用)。 首先,編輯Modules/Setup以包含所需的所有擴展模塊。 接下來,構建Python,獲取libpythonxy.a。 然后,您運行freeze,獲取許多C文件和config.c。 您也可以編譯它們,並將它們集成到libpythonxy.a中(或創建一個單獨的庫)。

對於要集成的每個體系結構和Python版本,您只需執行一次此操作。 構建應用程序時,只鏈接libpythonxy.a和凍結的庫。

您可以嘗試使用ELF STATIFIER 我以前一直在使用它,它運作得相當好。 我在幾個案例中遇到了問題,然后我不得不使用另一個名為Ermine的類似程序。 不幸的是,這是一個商業計划。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM