web-dev-qa-db-ja.com

gccで静的リンクライブラリと動的リンクライブラリの両方を使用する

できるだけ多くのx86 Linuxディストリビューションで実行できるバイナリを配布する必要があります。つまり、ユーザーが使用しているバージョンを使用していない可能性があるため、glibcなどの一部のライブラリを静的にリンクする必要があります。他のライブラリはfontconfigのように動的にリンクする必要があります。これは、各システムで異なる可能性があるキャッシュファイル形式とハードコードされた場所に依存しているためです。

これを行うためのコマンドラインオプションは何ですか? -staticを指定すると、gccはライブラリを動的にリンクすることを拒否します。

44
Steve Hanov

最近のUNIXまたはLinuxシステムでは、任意のシステムライブラリ、特にlibcに対して静的にリンクすると、バイナリが大幅に少なくポータブルになります。しないでください。

代わりに、下位システムとの互換性を使用して(古いシステムにリンクされたバイナリがすべての新しいシステムで引き続き実行されます)、古いシステムにバイナリをリンクして(RedHat 6.2を使用していて、バイナリが動作するLinuxシステムを見たことがない)過去8年間は実行されません)、または autopackage (この回答が書かれた後に削除されました)のようなものを使用します。

元の質問に答えるには:

gcc main.o -Wl,-Bstatic -lfoo -Wl,-Bdynamic

リンカはlibfooのアーカイブバージョンを使用します。 [静的libcを強制しないように、末尾に-Wl,-Bdynamicを正確に指定することが重要です。]

79

Linuxでは、ライブラリを(安全に)静的にリンクできるのは、動的ライブラリに依存しない場合のみであることに注意してください。つまり、動的ライブラリを使用している場合、libcの静的リンクを忘れることができます。かなり古いバージョンを使用して、libcのケースに対応してください。 libcは、長年にわたって強力なABI下位互換性を維持しています。

5
bdonlan

リンクするライブラリファイルへのパスをリンカーコマンドラインで渡してみて(それらが.aまたは.soライブラリであっても)、-staticを削除します。これでうまくいくはずです。

3