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

StackOverflow https://stackoverflow.com/questions/809794

  •  03-07-2019
  •  | 
  •  

質問

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

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

役に立ちましたか?

解決

現代のUNIXまたはLinuxシステムで、システムライブラリ、特に libc に対して統計的にリンクすると、バイナリは less 移植可能になります。しないでください。

代わりに、古いシステムにバイナリをリンクすることにより、後方互換性を使用します(古いシステムにリンクされたバイナリはすべての新しいシステムで実行され続けます)(私はRedHat 6.2を使用し、Linuxシステムを見たことがない)過去8年間でバイナリが実行されない場合)、または自動パッケージ(この回答が書かれた後に削除されました)。

元の質問に答えるには:

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

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

他のヒント

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

リンカーコマンドライン(.aまたは.soライブラリ)でリンクするライブラリファイルへのパスを渡して、-staticをドロップしてください。これでうまくいくはずです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top