2011-07-05 12 views
69

-Wl,-Bstaticを使用してください、gccを静的にリンクしたいライブラリを教えてください。結局のところ、gccにライブラリとのリンクに関する他の情報(-Ldir-llibname)を直接伝えています。ライブラリを静的にリンクさせるにはgccに直接連絡します

静的にリンクするライブラリをgccドライバに直接伝えることはできますか?

明確化:私は、特定のライブラリが静的バージョンでのみ存在する場合、それは-Wl,-Bstaticせずにそれを使用するだろうことを知っているが、私は静的ライブラリを好むgccを意味します。私はまた、ライブラリファイルを直接指定することでそれがリンクされることを知っていますが、私は静的ライブラリと動的ライブラリを同じ意味で含むことを望んでいます。

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

をしかし、これはgccのドライバーと話をされていませんが、-Wl,anythingのようなオプションとしてldリンカーである:

答えて

81

-lの代わりに-l:を使用することもできます。たとえば-l:libXYZ.alibXYZ.aとリンクさせます。 libXYZに自動拡張される-lXYZではなく、libが書き出されていることに注目してください。

+25

Gnuだけが、lib接頭辞の狂気ではなく、これを最初にデフォルトにしたのであれば神です。ああ、私たちが救ったはずの時間と不満。 – Timmmm

+3

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

+4

実際には、 'ld'リンカhttps://sourceware.org/binutils/docs/ld/Options.html" * '-l namespec'のオプションです。namespecが:filenameという形式の場合、ldはELF ..システムでは、ldはlibnamespecという名前のライブラリを探す前にlibnamespec.soという名前のライブラリをディレクトリから検索します。これはlibnamespec.aというファイルのライブラリパスを検索します。 a。この動作は、filenameには当てはまりません。filenameは常にfilename。* "というファイルを指定します。 binutils 2.18 - https://sourceware.org/binutils/docs-2.18/ld/Options.html – osgx

89

あなたは、リンクコマンドでは.aファイルを追加することができます。

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

なgccの呼び出しを使用して、静的にLIB1、動的にLIB3とLIB2を使用してプログラムをリンクする:

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

LDのデフォルト設定は動的ライブラリを使用することであると仮定すると(Linux上にあります)。

+2

ショートバージョン:現在の 'gcc'でこれを行う方法はありません。 –

+3

Elazar Leibovich、しかし 'gcc program.o -llib1 -Wl、-Bstatic -llib2 -Wl、-Bdynamic -llib3'はトリックです。 – osgx

+0

ええ、問題は具体的にどのように 'ld'オプションを直接指定することなくそれをするかということでした。 –

関連する問題