6

問題

リンクがどのように機能するかについての詳細な情報はほとんどありません。また、IDEはコンパイルの詳細を非表示にします。これは、プロジェクトにリンク関連の問題がある場合に非常に苦痛です。

通常、C++の本は私にそれを教えてくれます

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

しかし、リンクエラーが一般的であるという事実にもかかわらず、平均的な開発者がリンクについて知っておくべきことについては、実際にはあまり詳しく説明していません。新しいC++プログラマーは、次のようなエラーに対処する方法をどのように知っている必要がありますか?

XmlRpcSocket.o:XmlRpcSocket.cpp:(.text+0x48b): undefined reference to `WSAGetLastError@0'

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

また、リンクがどのように機能するかに関するリソースは不足しており、私が知っているほとんどの人は、リンクをブラックボックス操作と見なしています。リンクについて私が学んだことは、実験を通して、ちょっと「途中でそれを拾い上げた」ということですが、このアプローチの問題は、それが答えるよりも多くの質問を提起することです。

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

質問

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

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

4

4 に答える 4

2

たくさんのリソース があります。

「初心者」にとっては圧倒されるかもしれません;)

「Windows」に関しては、ここから始めるよりも悪いことをする可能性があります。

これもお勧めします:

「それが役立つことを願っています:)

PS:

明確化として:

  • 「コンパイル」したビット (機械語コードに) がすべて「リンク」によってどのようにまとめられるかを知りたいとします。完全に公正な質問:)

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

  • ...そして、「実行中のプログラム」が(静的).exeの一部と動的ランタイム(.dll、または「動的にリンクされたライブラリ」)の他のビットをどのように使用するか。

  • これらの詳細はすべて、完全にプラットフォームおよび OS 固有であることがよくあります。

  • したがって、(さまざまな)リンク。

繰り返しますが、すべてが最初の質問に役立つことを願っています.

于 2012-08-24T22:50:41.863 に答える
1

John Levine の「Linkers & Loaders」を読むことを強くお勧めします。本の大部分はここからオンラインで入手できますが、本を購入して著者を支援する必要があります。この本は、バイナリを実際に掘り下げる方法について多くのことを教えてくれました。

于 2012-08-25T02:16:39.050 に答える
0

知っておくべき点の 1 つは ODR であり、特にinlineシンボルに対する ODR の意味です。

ウィキペディアのエントリは良い出発点かもしれません。

于 2012-08-25T02:28:41.750 に答える
0

プログラミング / C++ を始めている場合は、静的ライブラリと動的ライブラリがどのように機能するかをよく理解し、.dll と .lib を作成するためのチュートリアルをいくつか作成することから始めます。これについては、Google があなたの親友です。たとえば、http://www.bogotobogo.com/cplusplus/libraries.phpでこれを見つけることができます。

lib を作成する方法は、C++ コンパイラによって異なることに注意してください。私が頭に浮かんだのは、Visual Studio のような統合開発環境 (IDE) や、gnu C++ コンパイラーです。

于 2012-08-24T22:59:13.637 に答える