- ベストアンサー
.objファイル、.lib ファイルについて
◆C++でのコンパイルされたプログラムの参照について。 以前、VB.netで開発をしていた時は、コンパイルをするとDLLが作成され、 それを他のプログラムからリンクして使用していました。 C++の場合h、cppのファイルをコンパイルすると、「.DLL」はできないのでしょうか? ◆.obj、.lib について Visual Studioにて、.obj、.lib を、参照先に設定していますが、 内容をよくわかっていません。 オブジェクトリンク、ライブラリリンクとは、 (1)それぞれどんな概念なのでしょうか? (2).obj、.libでは何が違うのでしょうか?
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
まず、.NETエンジン上で動作するマネージ系EXE、DLLとCPUが直接解釈するネイティブ系EXE、DLLは拡張子こそ同じですが、本質的に異なるものであることを理解していないと、混乱を生じる可能性があります。私は.NET系の知識が乏しいプログラマですが、もし、ご質問で対象となっているDLLがネイティブ系なものであればご参考にしていただけるかも知れません。 拡張子OBJのファイルは、C/C++コンパイラがコンパイル単位で生成するバイナリファイルです。最終的なEXEファイルは連携するDLL等と静的に定義されますが、OBJの段階ではリロケータブル(再配置可能)なバイナリコードで構成されていると理解しています。 OBJファイルが最終生成ファイルになる時、外部のDLLやEXEへの参照関数名を解決する目的で存在しているのが、LIBファイルです。ですから、OBJは比較的大きく、対してLIBファイルは小さなものになります。LIBを利用して静的に参照定義されたEXEファイルはそのロード時に参照先DLL等がロードされなければなりません。これに対して動的な参照によりDLLを利用する方法も存在します。 動的な参照とは、既に実行済みなプロセスが、必要時に「こんなファイルはありますか?」から始まって、「こんな関数は?」というようなチェックの後に実際の呼び出しを行う事を意味します。この代表的な例はCOMDLL呼び出しですし、マネージ系のDLL参照も恐らくこの方式だと思います。 動的な参照の場合、どんな関数やクラス、メソッドを持っているのかを確認する工夫としてタイプライブラリという概念が導入されました。これは開発言語とは独立した文法でクラスとメソッドを確認する機構で、独立したTLBファイルな場合もあれば、DLL等にリソースとして格納されている場合もあります。よくVBA等でCOMDLLを利用する場合「参照が必要」と表現されるのはこのタイプライブラリということになります。 マネージ環境では従来のタイプライブラリに代わるものとして、クラスやメソッドが中間コンパイル後もある程度見える状態にして動的な参照を実現しているのではないかと推察しますが、この事について深く探求したことはありません。 ご質問の内容から、推し量りますと、C++でコンパイルされたDLLがマネージ系DLLであることを期待なさっているように見えますが、それが実際にマネージ系なのかは、.NETのSDKに付属するildasm.exe等で確認できると思います。ネイティブ系のEXE、DLLであった場合前述のツールは単にエラーを報告するはずです。 結果、C++でマネージ環境向けにコンパイルされたDLLで、参照できない場合の要因について適切な返答をできるほどの知識を持ち合わせてはいませんが、ネイティブ系なCOMDLLであり、タイプライブラリがあるとすれば、MSDNの「アンマネージ コードとの相互運用」という項目などを手がかりに解決できるのではないかと思います。
お礼
ありがとうございます。 最初は全然理解できなかったのですが、段々とわかってきて、理解ができるようになりました。 非常に助かりました。ありがとうございます!