web-dev-qa-db-ja.com

g ++リンカー:静的ライブラリが存在する場合、静的リンクを強制しますか?

多くのライブラリにリンクするプログラムがあります。 g++は、対応するアーカイブが存在する場合でも、デフォルトで共有ライブラリにリンクすることを好みます。

静的アーカイブが存在する場合、動的ライブラリよりも静的アーカイブを優先するようにこの設定を変更するにはどうすればよいですか?

注:-staticオプションを使用しましたが、すべてのライブラリの静的アーカイブを見つけようとしますが、これは望んでいないものです。

55
kumar
g++ -Wl,-Bstatic -lz -lfoo -Wl,-Bdynamic -lbar -Wl,--as-needed

zliblibfooを静的として、libbarを動的としてリンクします。 --as-neededは、未使用の動的ライブラリを削除します。

68
naideflan

システムライブラリを含む残りのライブラリと動的に1つまたは2つのライブラリのみを静的にリンクする場合は、多くの場合、静的ライブラリを完全な名前で単純に参照する方が簡単です。つまり-lおよび-Lを使用してg ++を取得し、見つかったものからライブラリを解決するのではなく、入力としてライブラリへのフルパスを追加します。上記のg ++​​コマンドを使用して、main.oアプリケーションのメインプログラムを静的libzとlibfoo、および動的libbarとlibglibなどにリンクします。

    g++ main.o /usr/lib/libz.a /usr/lib/libfoo.a -lbar

編集3 8月17日:私はちょうどつまずいた この答え これはより詳細になり、ライブラリを直接指定する代替方法(-l:)を提供します。

5
stanthomas