私はGentooで完全に静的にリンクされたバイナリを作成する方法を探しています。
ビルドシステムはMesonです。私は試しましたが--prefer-static
成功--default_library=static
しませんでした。
1つの可能な障害は、一部のライブラリ(たとえば、libevent
およびglib
)に静的バージョンがインストールされていないことです(libc
他のライブラリとは異なり)。emerge
特別なフラグを使用して再実行する必要がありますか?
答え1
該当するすべてのパッケージの静的リンクのサポート
--static
より安全なアプローチは、Gentoo専用ライブラリで必要なライブラリをコンパイルするよりもシステム全体を静的にすることです。static-libs
あなたがいるようにオンラインパッケージリポジトリ、多くのソフトウェアパッケージがstatic
USEフラグをサポートしています。
静的接続とは何ですか?
静的リンクは、ユーザーが特定のアプリケーションライブラリにアクセスできない組み込みシステムまたはデバイスのプログラムに役立ちます。 Windowsベースのシステムでは、これらのライブラリは通常、拡張子.DLL
(略語)を持つファイルとして保存されますDynamic Linking Library
。 Linuxでは、これらのライブラリは通常、拡張子または.so
(.so.versionNumberOfProgramThatUsesLibrary
共有オブジェクトの略)ファイルとして保存されます。静的にコンパイルされると、上記のライブラリファイルはコンパイルされたプログラムと共に提供されるため、ユーザーは完全な書き込みアクセス権を持つホームディレクトリに完成したプログラムをコピーでき、プログラムは同じライブラリの代わりにそのホームディレクトリのライブラリファイルを使用します。ファイル 。ユーザーがアクセスできないホストシステムのライブラリ。静的接続と動的接続の詳細については、次を参照してください。静的ライブラリと動的(共有)ライブラリリンクの違いは何ですか?
警告に注意する
Gentooの最初の年に、ユーザーはさまざまな段階のタールボールでシステムを構築することができました。バラよりGentoo Wikiのステージタールボール。。警告の内容は次のとおりです。
起動中にこれを設定しないでください!バイナリが動的にリンクされるのではなく静的にリンクされるようにします。
最初のステップに適用されます。避けるために存在する鶏が先か、卵が先か?。静的ライブラリーを使用して静的ライブラリー・ファイルをビルドできないため、静的ライブラリーを使用するプログラムまたはライブラリーがないプログラムにはライブラリー・ファイルを含めることはできません。言い換えれば:静的ライブラリをビルドしてプログラムに含めるには、ホストシステムの動的リンクライブラリを使用する必要があります。。
Gentooでこれを行う方法
USEフラグおよび/または設定ファイルを微調整します(優れたツールはアプリケーション-Portage/ufed
static
、USE Flag Editorの略語)は、新しくインストールされたシステムで機能しますが、またはを追加しないでくださいstatic-libs
。これにより、デスクトップ環境、サウンドサポート、カーネルの再構築などを追加でき、基本セットは動的@system
ライブラリを引き続き使用できます。- 確実にするステップ2はエラーなしで完了しました。また、ステップ2を複数の部分に分けることができます。たとえば、デスクトップサポートを有効にして
emerge
そのサポートを構築するために使用して再実行し、ufed
いくつかの種類のグラフィックサポートを追加してからemerge
やり直します。
- 確実にするステップ2はエラーなしで完了しました。また、ステップ2を複数の部分に分けることができます。たとえば、デスクトップサポートを有効にして
もう一度実行し
ufed
てUSEフラグを追加しstatic
てくださいstatic-libs
。その後、ツリー全体を再構築し、各パッケージのサポートおよびUSEフラグを更新するには、emerge -ea
forを実行します。--empty-tree --ask
static
static-libs
私はこの方法を「2パス防弾方法、2パスコンパイルとも呼ばれる」と呼びます。ステップ2の最初のステップでは、ステップ3の開始時に問題がないことを確認します。手順3の2番目のパスが何らかの方法で失敗した場合は、エラーを修正して手順3を再開するか、emerge --resume
前の手順のどれもユーザーのエラーによって破損しないことを知って使用して続行できます。以前は、エラーを修正した後、誤ったパッケージはインストールされません。)
中間者
私たちが見ると開発ユーティリティ/中間者パッケージリポジトリから我々は見ることができます電子ビルドUSEフラグを直接サポートするわけではありませんが、static
多くの依存関係がサポートされているので、static
必要なstatic-libs
ものを取得できます。