2012-06-05 11 views
7

私はこの用語「シンボルをエクスポートする」を探していました。 C/C++やライブラリ(共有/静的)に関するシンボルの意味は何ですか?どこからシンボルをエクスポートするのですか?なぜですか?シンボルをコンパイラによってmanglingする名前とのエクスポートの関係は何ですか?シンボルのエクスポートは何を意味しますか?

+0

_declspec(dllimportの/輸出)のために見て、私はあなたが偉大な説明を見つけることができると確信しています。 –

+2

また、質問は重複しているために下落していませんでしたが、恐らくあなたがSOによって提案された重複したものを無視したためです。 –

+1

なぜそれがofftopicですか? – littleadv

答えて

16

は、シンボルをエクスポートすると、オブジェクト・ファイル/ライブラリにある「広告」その存在を意味し、それがどこにあるか、それをインポートすることができるように、他のモジュールで(=にリンクされています)。

は、リンクは静的または動的に行うことができますが、それがどこにあるかのいずれかの方法は、リンカはシンボルが何であるかを知っている必要があり、そして、それが起こることをするためにエクスポートシンボルとインポートされたシンボルが一致する必要があります。名前マングリングはそれに関連しています(C++の名前マングリングはシンボル名にシンボルの型定義を含みます。また、インポートおよびエクスポートされたシンボルのマングリングはリンカーがインポート・エクスポートを正しくリンクするためにマッチする必要があります)。


例:

あなたは、ライブラリ "STANDARDC"(ランダムな名前)とあなたのプログラムSOMEPROGがあるとします。プログラムSOMEPROGはコンソールに出力する必要があるので、printfを呼び出します。しかし、プログラムSOMEPROGに実際にprintfを実装していないのですが、実装は他の場所で実装されています(= import)。

ライブラリSTANDARDCは、それがそのライブラリに実装されており(=エクスポートされた関数)外部から呼び出すことができるすべての関数を含むエクスポートシンボルのリストを有しています。 printfはそのような関数の1つで、エクスポートされたリストに表示されます。

コンパイラはSOMEPROG.Cを通過し、あなたがprintfを参照することを見て、それのための実装はありません。コンパイラは、結果のSOMEPROG.objのインポートされたシンボルのリストにprintfを追加します。

リンカはSOMEPROG.objファイルとSTANDARDC.libファイルを取得し、どの機能がSOMEPROG.objで使用されていますか。リンカは、それがインポートされ、printfが実装されていないことを見つけたので、リンカはそれが持っているすべての.libファイルを通して見るとSTANDARDCのエクスポートリストにprintfに一致する検索します。 STANDARDCからprintfの実装が取り込まれ、インポートされたシンボルprintfを参照するあらゆる場所でプログラムにリンクされます。

+1

あなたはその例を説明することができますか。なぜ私のシンボルをエクスポートしたいですか? – Raulp

+1

@softyに例が追加されました。 – littleadv

関連する問題