静的オブジェクトを含むバイナリビルド

静的オブジェクトを含むバイナリビルド

関連する.soファイルを含むバイナリをビルドしてバイナリを一度ビルドし、.soファイルなしで同じハードウェアとオペレーティングシステムを使用するシステムで使用できますか?

たとえば、私はnghttp2を使用してカールを作成しています。はい

 ./configure --with-nghttp2=/usr/local

それから私は走った。カールバイナリを手に入れた。このバイナリを別のコンピュータにコピーして実行しようとすると、次のように表示されます。

./curl: error while loading shared libraries: libnghttp2.so.14: cannot open shared object file: No such file or directory

また、次のようにmakeを実行してみました。

make SHARED=0 CFLAGS='-static'

それでも同じエラーが発生します。

答え1

依存する.soファイルは、共有オブジェクト(.soファイル)または.aファイル(静的オブジェクトとも呼ばれる)の形式にすることができます。 nghttp2 を再構築し、--disable-sharedその設定にフラグを渡すことができます。その後、通常どおりカールを再構築して再構築できます。

重要なのは、/usr/local/lib にある静的 .a オブジェクトのみがカールにリンクできることを確認することです。

/usr/local/libにnghttp2の.soバージョンが含まれていないことを確認することを忘れないでください! (または他の--prefix =を指定して実験することもできます。/ tmpまたは$ HOMEに何でもインストールし、ローカルに生成されたツリーを使用することもできます)

この点に注意してください〜しないだろうカールはサードパーティのコードに依存する大規模なプロジェクトなので、他の依存関係を排除します。 libcurl自体に依存することもできます。--disable-sharedフラグを渡して静的バージョンのみを構築できます。最後に、readelf -d /path/to/your/curl | fgrep NEEDED全体の依存関係を確認するために実行してください!

関連情報