2016-04-17 16 views
7

gccの代わりにldリンカーをいつ使うべきか知りたい。私はちょうどC++で単純にこんにちはの世界を書いた、もちろん私はiostreamライブラリが含まれています。 gccでバイナリファイルを作成したいのであれば:gccではなくldを使うべきですか?

g++ hello hello.cpp 私はバイナリファイルを持っています。

後でldリンカーを使用しようとしています。オブジェクトファイルを取得するには、 g++ -c hello.cppを使用します。それは簡単でしたが、リンクコマンドはひどいものでした:

ld -o hello.out hello.o -L /usr/lib/gcc/x86_64-linux-gnu/4.8.4/ /usr/lib/gcc/x86_64-linux-gnu/4.8.4/crtbegin.o /usr/lib/gcc/x86_64-linux-gnu/4.8.4/crtend.o /usr/lib/x86_64-linux-gnu/crti.o /usr/lib/x86_64-linux-gnu/crtn.o /usr/lib/x86_64-linux-gnu/crt1.o -dynamic-linker /lib64/ld-linux-x86-64.so.2 -lstdc++ -lc

gccはldを使用しています。 gccを使用すると、すべてのケースで優れていますか、ほとんどの場合のみですか? ldリンカが優位に立っているケースについて何らかの理由で教えてください。

+1

リンカを直接使用すると、GCCを使用していない場合にのみ利点が得られます。さもなければ、 'gcc'や' g ++ 'を使って、多くのタイプの入力を保存し、より重要なのはあなたが入力する必要があるものとそのタイミングを正確に把握することです。 –

+0

ありがとう、私はldの役に立つ使い方に気付かなかったことを恐れていました。 Btwあなたはリンクする必要があるg++ -v -o hello hello.cppライブラリを使用することができます。だから、リンクファイル/ liberriesに関するすべての機能、私はgccを使用して設定できますか? – Ice

+1

問題は、使用するGCCオプション、使用しているOS、GCCのバージョン、その他の要因によってオブジェクトファイル、ライブラリ、およびオプションのリストが変わることです。 'gcc -o hello hello.o'のようなコマンドを使って、GCCで作成したオブジェクトファイルをリンクすることができます。 –

答えて

6

上記のとおり、gccはリンク時にldのフロントエンドとして機能します。すべてのリンカディレクティブ(オプション、デフォルト/システムライブラリなど)を渡し、これらのすべてを処理することですべてがうまく収まるようにします。ツールチェーン固有の詳細。

私はGNUツールチェーン全体を緊密に統合された環境と考えるのが最善だと思います。(例えば、dietlibcの統合を含むいくつかのエキゾチックな組み込みプラットフォーム用のツールチェーンを構築した経験のある人ならおそらく同意します。

非常に具体的なプラットフォーム統合要件がある場合や、gccを使用しない理由がある場合を除き、ldを直接リンクするという利点はほとんどありません。追加のリンカー固有のオプションは、gccコマンドラインの接頭辞で簡単に指定することができます(まだgccオプションとして利用できない場合)。

+1

結論として、ldはリンクされているファイルに対してより多くの制御/知識を提供しますが、私は正しく理解していますか? – Ice

+1

それはgccの問題で、素晴らしい、痛みのない統合を保証します(複数の要因に関する@RossRidgeのコメントを参照)。あなたが必要とするldオプションは '-Wl 'でgccを引き継ぐことができます。 – xbug

2

ほとんどの場合、趣味の問題です。コマンドラインがgccよりも単純な場合は、直接ldを使用します。これは、少数の共有オブジェクトを操作するためにリンカを使用するだけの場合(たとえば、依存性の少ない共有ライブラリを作成する場合)です。

ldにオプションを渡すことができるので、多くの人はgccを使用してコマンドラインを管理することをおすすめします。

関連する問題