問題
リンクの詳細についての情報は不十分です。また、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をロードする場合、いくつかの異なる標準ライブラリをプロジェクトにリンクすることはできますか?など
質問
はもちろん、私は一度のすべての上記の質問に対する答えを期待してはいけません。私はどこから始めるべきかを知る必要があります。 「すべてのプログラマーがメモリについて知っておくべきこと」のようなリソースがありますか?リンクについて話していますか?ですから、私は学ぶためのリソースと、リンクのプロセスについて学ぶためにどの方向に向かうべきかについてのあなたの洞察力が必要です。
開発者がリンクについて知っておくべきことは何ですか?
C++言語は現在モジュールとライブラリをサポートしていないため、このようなサポートは実装固有の言語拡張で行われることがよくあります。特定のオペレーティングシステムとコンパイラについて同じ質問をすることをお勧めします。 –
その方法はposixとwindowsの両方で非常によく似ています。あなたは.lib/.aファイルを持っています。あなたは.dllと.soファイルを持っています。両方のシステムで_undefined reference_エラーがあります。オブジェクトファイルの形式は異なりますが、共通点がたくさんあります。この質問は、公式のC++のドキュメントがリンクについて言うものではなく、標準ではリンクが_implementaion detail_であることがわかっています。そのC + +の世界でリンクする共通の実践についてです。 – Klaufir
Windowsでは、 '__declspec(dllexport)'のようなものをC++コードに書かなければならないかもしれませんが、unixでは正しいリンクをサポートするために '__attribute__((__visibility __(" default ")))' –