2016-12-29 16 views
4

linuxローダーは/ usr/bin/ldと言われていますが、通常はgc/g ++を使ってライブラリと実行ファイルをリンクしています。「gccリンク」と「ldリンク」の関係は何ですか?

最後に私が "ld"を手動で使用したのは、Linuxアセンブリを学んだときでした。実行可能ファイルを生成する唯一の方法は.oファイルを使ってライブラリなしで直接実行可能ファイルを生成することです。

gcc/g ++には "ld"の関数ラッパーが含まれていますが、未使用の "ld"は使いにくいのですか?または、blablablaのために、c/C++プログラムのリンクに "ld"を明示的に使用しないでください。

ありがとうございます。

+0

[gccの代わりにldを使用する必要がありますか?](http://stackoverflow.com/q/36680470)、[gcc(g ++なし)でC++コードをリンクする](http:// stackoverflow。 com/q/1001535)、および友人 – jww

答えて

6

gccは、いくつかのデフォルトオプションをldに提供しています。

ldは、C++やその他の言語については何も知らない。 ldはあなたのコードがリンクする必要があるライブラリが何も分かりません。コンパイルされたC++コードをldに直接リンクしようとすると、ldは単独で、libstdc++、gccのC++ランタイムライブラリがどこにあるのか分かりません。文字列を使用していますか?ベクトル?そのほとんどは、オブジェクトモジュールの一部としてコンパイルされたテンプレートコードです。しかし、あらかじめコンパイルされたビットはまだありませんが、libstdc++にリンクする必要があります。

gccにコンパイルしたコードをリンクすると、gccはすべてのファイルをldに渡し、明示的に指定するライブラリに加えて、ldと言うライブラリを教えてくれます。

同じライブラリとリンクオプションgccを使用している限り、必要に応じてldと直接リンクすることができます。しかし、なぜあなたはそれをしたいですか? gccを使ってgccコンパイルしたコードをリンクするだけです。

2

私の質問は、GCC/G ++権利だ "LD"

のいくつかの機能のラッパーを含むです。

生の "ld"は使いにくいですか?

tooという問題がなくても自分で使うことができますが、ビルドプロセス全体を1つの実行可能ファイルで管理すると便利です。

ラッパーをバイパスした場合は、ランタイムライブラリ(libstdC++ .aなど)に絶対パスを指定する必要があります(これはテストしていませんが)。

または、blablablaのためにc/C++プログラムのリンクに明示的に "ld"を使用しないでください。

必要に応じて自由にすることができます。人々が眉を上げる唯一の理由は、従来の方法でそれをやっていない理由を尋ねることです。 g++を経由してリンカフラグを通り抜けるのではなく、ldを直接呼び出すのが正当な理由がある場合は、右に進んでください!

2

は、C++ランタイムライブラリの静的部分の配置の詳細を知る必要があるため、直接C++プログラムをリンクすることは避けてください。 g++は、ファイルlibstdc++.aの場所など、これらの実装の詳細を認識します。 ldを直接使用しようとすると、これらの「不足している」静的ライブラリをすべて提供する必要があります。

+0

libstdC++をデフォルトで使用していても、libstdC++内にまだいくつかの内容がありますが、実行可能ファイルに静的にリンクされていますか?これらのコンテンツは何をしていますか?ありがとう。 – Troskyvs

関連する問題