ライブラリを静的にリンクするようにgccに直接指示する


133

静的にリンクするライブラリを指定-Wl,-Bstaticするために使用するのは不思議ですgcc。結局のところgcc、ライブラリ(-Ldir-llibname)とのリンクに関する他のすべての情報を直接伝えています。

どのライブラリを静的にリンクする必要があるかをgccドライバに直接伝えることは可能ですか?

明確化:特定のライブラリーが静的バージョンにのみ存在する場合、それを使用せずにそれを使用することを知っています-Wl,-Bstaticgcc、静的ライブラリーを優先することをほのめかしたいと思います。ライブラリファイルを直接指定するとリンクされることも知っていますが、静的ライブラリと動的ライブラリを同じように含めるためのセマンティックを維持することを好みます。

回答:


189

もちろん、の-l:代わりに使用することも可能です-l。たとえば、-l:libXYZ.aとリンクしlibXYZ.aます。が自動的に展開さlibれるの-lXYZではなく、書き出されていることに注意してくださいlibXYZ


63
そもそもGnuだけがlibプレフィックスの狂気の代わりにこれをデフォルトにしたのなら、神は。ああ、私たちが救った時間とフラストレーション。
Timmmm 2015年

9
Radek、この-l:オプションは文書化されていますか?どのバージョンのgccを使用する必要がありますか?
osgx 2016年

18
実際には、それはldリンカーのオプションですsourceware.org/binutils/docs/ld/Options.html " -l namespec.. namespec の形式が:filenameの場合、ldはファイル名と呼ばれるファイルのライブラリパスを検索します。それ以外の場合はライブラリを検索しますELF ..システムではlibnamespec.a。..というファイルのパス、ldはlibnamespec.aというライブラリを検索する前にlibnamespec.soというライブラリをディレクトリで検索します。この動作は:filenameには適用されないことに注意してください。 、これは常にファイル名と呼ばれるファイルを指定します。binutils 2.18以降-sourceware.org/binutils/docs-2.18/ld/Options.html
osgx

17
GNUは、このインターフェースに対して責任を負いません。Unixツールチェーンから継承されました。
akim

これは、GNU以外のリンカでは機能しないのが残念です。これは、LDLIBSと同様の構成オプションを「強制」して、奇妙なリンクフラグの回避策なしに静的ライブラリを見つけるのに良い方法です。
nneonneo

130

リンクコマンドで.aファイルを追加できます。

  gcc yourfiles /path/to/library/libLIBRARY.a

しかし、これはgccドライバーとは通信しませんが、ldオプションのようなリンカーとは通信します-Wl,anything

gccまたはldを指定すると-Ldir -lLIBRARY、リンカーはライブラリの静的バージョンと動的バージョンの両方をチェックします(プロセスはで確認できます-Wl,--verbose)。チェックされたライブラリタイプの順序を変更するには-Wl,-Bstatic、およびを使用できます-Wl,-Bdynamic。ここにgnu LDのmanページがあります:http : //linux.die.net/man/1/ld

プログラムをlib1、lib3を動的に、lib2を静的にリンクするには、次のようなgcc呼び出しを使用します。

gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3

ldのデフォルト設定が動的ライブラリを使用することを前提としています(これはLinux上にあります)。


3
ショートバージョン:currentでそれを行う方法はありませんgcc
Elazar Leibovich

7
Elazar Leibovich、しかしgcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3トリックをします。
osgx

13
リンク(およびdyn / static libsの検索)はリンカーによって行われるため、リンカーオプションを使用する必要があります。-lそして、-Lリンカオプションもあります。
osgx

3
この答えは、理由のupvotedていますgcc yourfiles /path/to/library/libLIBRARY.a-Wl,-Bstatic
Tor Klingberg、2017年

7
@TorKlingberg、バリアント1を記述するには/path/to/library/libLIBRARY.aフルパスが必要です。バリアント2 -Wl,-Bstatic -llib2 -Wl,-Bdynamicは長く、2つのオプションが追加され、デフォルトモードがBdynamicであると想定されています-l:libXYZ.a。受け入れられたバリアント3 は短く、機能します。3つすべてが多くの場合に機能し、静的プログラムをリンクするときにバリアント2が機能しない場合があります。libの実際のリンク手順は、私が理解しているすべてのバリアントで同じです。
osgx 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.