2012-08-24 15 views
6

問題

リンクの詳細についての情報は不十分です。また、IDEはコンパイルの詳細を隠します。これは、プロジェクトに関連するいくつかの問題があるときには本当に苦痛です。すべてのC++開発者がリンクについて知っておくべきこと

通常C++の本は

C++ code --> preprocessed c++ code --> object code 

ことを教えしかし、彼らは本当に平均的な開発者は、リンクエラーが共通しているという事実にもかかわらず、リンクについて知っておくべきものにあまり詳細には触れません。新鮮なC++プログラマは、次のようなエラーにどのように対処するべきかを知っていますか?

XmlRpcSocket.o:XmlRpcSocket.cpp:(.text+0x48b): undefined reference to `[email protected]' 

しかし、この問題は特にこの問題に関するものではありません(-lwsock32が解決します)。問題は、リンクに関する一般的な知識の欠如です。私の大学のC++の講師は、1つのスライドの時間をいくつかのブラックボックスでリンクすることについて話しました。

また、リンク作業の方法に関するリソースが不足しています。私が知っている人のほとんどは、リンクをブラックボックス操作と見なしています。私がリンクについて学んだことは、実験を通して、ちょっと "それを拾った"ことですが、このアプローチの問題は、答えよりも多くの疑問が生じていることです。

例:.LIBファイルは、オブジェクトファイルのバンドルであるライブラリファイルです。 .LIBファイルをビルドして使用するにはどうすればよいですか?いつ.LIBファイルを使用するのが望ましいですか?いつ私は静的な.LIBファイルまたはDLLを参照するものをビルドする必要がありますか? .LIBファイルをオブジェクトファイルにリンクすると、すべてがコピーされるか、私が使用するオブジェクトファイルだけがコピーされますか?静的にリンクするのではなく、DLL /ファイルをいつビルドするのですか?一般的な問題を解決するためにオブジェクトファイルの内部構造について知る必要がありますか?ネームマングリングについて私は何を知る必要がありますか?関連性はいつですか? DLLの1つが古いmsvcrtをロードする場合、いくつかの異なる標準ライブラリをプロジェクトにリンクすることはできますか?など

質問

はもちろん、私は一度のすべての上記の質問に対する答えを期待してはいけません。私はどこから始めるべきかを知る必要があります。 「すべてのプログラマーがメモリについて知っておくべきこと」のようなリソースがありますか?リンクについて話していますか?ですから、私は学ぶためのリソースと、リンクのプロセスについて学ぶためにどの方向に向かうべきかについてのあなたの洞察力が必要です。

開発者がリンクについて知っておくべきことは何ですか?

+0

C++言語は現在モジュールとライブラリをサポートしていないため、このようなサポートは実装固有の言語拡張で行われることがよくあります。特定のオペレーティングシステムとコンパイラについて同じ質問をすることをお勧めします。 –

+0

その方法はposixとwindowsの両方で非常によく似ています。あなたは.lib/.aファイルを持っています。あなたは.dllと.soファイルを持っています。両方のシステムで_undefined reference_エラーがあります。オブジェクトファイルの形式は異なりますが、共通点がたくさんあります。この質問は、公式のC++のドキュメントがリンクについて言うものではなく、標準ではリンクが_implementaion detail_であることがわかっています。そのC + +の世界でリンクする共通の実践についてです。 – Klaufir

+1

Windowsでは、 '__declspec(dllexport)'のようなものをC++コードに書かなければならないかもしれませんが、unixでは正しいリンクをサポートするために '__attribute__((__visibility __(" default ")))' –

答えて

2

TONSのリソースがあります。

私は "初心者" のための圧倒的なことかもしれないと思い、限りの "Windows" のように、あなたはここで開始することより悪い行うことができ

):

私はまた、 S:

'希望に役立ちます:)

PS:

を明確化したよう:

  • あなたはどのようにビットあなたを知りたいです' "コンパイルされた"(機械コードに)すべてが "リンク"することによって一緒になる。全く公正な質問:)

  • また...そのマシンコードが「実行中のプログラム」とどのように関連するかについて少し知っているのに役立ちます

  • ...とどのように「実行中のプログラムは、」いくつかを使用しています動的なランタイムから(静的).EXEからのビット、および他のビット(の.dllの、または「ダイナミックリンクライブラリ)。

  • これらの詳細のすべては、多くの場合、完全にプラットフォームやOS固有のもの

  • したがって、(多様な)リンク。

もう一度、あなたのの最初の質問に役立つことを願っています。

0

プログラミング/ C++を使い始めるなら、静的で動的なlibsの仕組みをよく理解し、.dllと.libを作るためのチュートリアルをいくつか作成します。 Googleはこのためにあなたの親友です:例えば、http://www.bogotobogo.com/cplusplus/libraries.phpのようなものです。

libの作成方法は、C++コンパイラによって異なります。私が頭上にあるのは、Visual Studioやgnu C++コンパイラのような統合開発環境(IDE)です。

1

John Levineの"Linkers & Loaders"を読むことを強くお勧めします。本のほとんどはavailable online hereですが、本を購入して作者をサポートする必要があります。この本はバイナリを本当に掘り下げる方法について私にかなり教えてくれました。

0

あなたが知っておくべき1つのポイントはODRで、特にinlineシンボルの意味です。

wikipedia entryは良いスタートかもしれません。

関連する問題