web-dev-qa-db-ja.com

Pythonインタプリタを静的にコンパイルしますか?

専用の埋め込みPython=インタプリタを構築していて、動的ライブラリへの依存を避けたいので、代わりに静的ライブラリを使用してインタプリタをコンパイルしたい(例:libc.aではなくlibc.so)。

また、Python標準ライブラリの一部であるすべての動的ライブラリを静的にリンクしたいと思います。これはFreeze.pyを使用して行うことができることを知っていますが、ワンステップで行われますか?

44
Jeremy Cowles

私はこれを見つけました(主にPythonモジュールの静的コンパイルに関する)):

ここにある設定に使用されるファイルについて説明します:

<Python_Source>/Modules/Setup

このファイルが存在しない場合は、以下をコピーして作成できます。

<Python_Source>/Modules/Setup.dist

Setupファイルには大量のドキュメントが含まれており、ソースに含まれているREADMEには多くの優れたコンパイル情報も含まれています。

私はまだコンパイルを試していませんが、これらのリソースを使用すると、私が試すときに成功するはずです。結果をコメントとしてここに投稿します。

更新

純粋な静的python実行可能ファイルを取得するには、次のように構成する必要があります。

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

これらのフラグを有効にしてビルドすると、「ライブラリが存在しないために名前を変更する」ことについて多くの警告が表示される可能性があります。これは、Modules/Setup正しく、次のことを行う必要があります。

a)次のように(最上部近くに)1行追加します。

*static*

(それはアスタリスク/スター「静的」とスペースのないアスタリスク)

b)静的に使用可能にするすべてのモジュール(数学、配列など)のコメントを外します。

特定のリンカーフラグを追加する必要がある場合もあります(上記で投稿したリンクで述べたように)。これまでの私の経験では、ライブラリは変更なしで機能しています。

次のようにしてmakeを実行すると役立つ場合もあります。

make 2>&1 | grep 'renaming'

これにより、静的にリンクされているためにコンパイルに失敗したすべてのモジュールが表示されます。

31
Jeremy Cowles

CPython CMake BuildsystemCMake を使用してPythonをビルドする別の方法を提供します。

python libを静的にビルドし、必要なすべてのモジュールをそのlibに含めることができます。CMakeのオプションを設定するだけです。

BUILD_SHARED                     OFF
BUILD_STATIC                     ON

BUILTIN_<extension>ONしたい。

9
Gaëtan Lehmann

フリーズを使用しても、1回の実行ですべてを実行できなくなるわけではありません(使用するアプローチに関係なく、複数のビルドステップが必要になります(例:多くのコンパイラー呼び出し)。まず、編集しますModules/Setupには、必要なすべての拡張モジュールを含めます。次に、Pythonをビルドしてlibpythonxy.aを取得します。次に、freezeを実行して、いくつかのCファイルとconfig.cを取得します。これらもコンパイルして、libpythonxy.aに統合します(または別のライブラリを作成します)。

このすべてを、各アーキテクチャおよびPython=統合するバージョン)に対して一度実行します。アプリケーションをビルドするときは、libpythonxy.aとリンクするだけで、フリーズしたライブラリが生成されます。

6

ELF STATIFIER で試すことができます。私は以前にそれを使用したことがあり、それはかなりうまくいきます。いくつかのケースで問題が発生しただけで、 Ermine と呼ばれる別の同様のプログラムを使用する必要がありました。残念ながら、これは商用プログラムです。

3
javier-sanz