• ベストアンサー

.objファイル、.lib ファイルについて

◆C++でのコンパイルされたプログラムの参照について。  以前、VB.netで開発をしていた時は、コンパイルをするとDLLが作成され、  それを他のプログラムからリンクして使用していました。  C++の場合h、cppのファイルをコンパイルすると、「.DLL」はできないのでしょうか? ◆.obj、.lib について  Visual Studioにて、.obj、.lib を、参照先に設定していますが、  内容をよくわかっていません。  オブジェクトリンク、ライブラリリンクとは、  (1)それぞれどんな概念なのでしょうか?  (2).obj、.libでは何が違うのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • __hide__
  • ベストアンサー率66% (2/3)
回答No.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の「アンマネージ コードとの相互運用」という項目などを手がかりに解決できるのではないかと思います。

TeferiMage
質問者

お礼

ありがとうございます。 最初は全然理解できなかったのですが、段々とわかってきて、理解ができるようになりました。 非常に助かりました。ありがとうございます!

関連するQ&A

  • obj オブジェクトファイルができる?

    VB6で、デザイン時や、コンパイル時に、 オブジェクトファイル(*.obj)が生成される事がありますか? よろしくお願いします。

  • リンクエラーについて

    C++の初心者です。 C++で作成したプログラムがリンクでエラーになります。 エラーの内容は、”LNK2019:未解決のシンボル_IoInitが間数XXXXで 参照されました。”です。 IoInit関数を含むライブラリ(C:\JAVAC\ciolib.lib)をリンクする必要があり、リンカの/DEFAULTLIBオプションでライブラリを指定しましたが、状況は変わりません。 リンカの内容は、以下のとうりです。 cl -I:"C:\Program Files\Microsoft Visual Studio 8\VC\include" -I:C:\j2sdk1.4.2_18\include -I:C:\j2sdk1.4.2_18\include\win32 -LD -FeCiolibJNI.dll CiolibJNI.cpp /link -libpath:"C:\Program Files\Microsoft Visual Studio 8\VC\lib" /NODEFAULTLIB:C:\JAVAC\ciolib.lib /DEFAULTLIB:C:\JAVAC\ciolib.libの指定が悪いのか状況は変わりません。それとも、指定オプションが悪いのか困っています。 リンカが悪いのであれば、修正箇所を教えてください。

  • VB 2008 DLL作成の方法

    当方Visual Studio 2008のVB、C++で開発をしています。 VS2008のVBでクラスライブラリとして作成し、ビルドをしてDLLを作成したのですが、 対となるLIBファイルがどこにも見当たりませんでした。 VS6.0のVBではLIBファイルも作成されました。 VS2008のVBでLIBファイルを作成する方法をご存知の方いらっしゃいましたら教えてください。 LIBファイルを使用する理由は、VBで作成したDLLをC++に組み込むときにリンクさせる為です。 ※今回はLoadLibrary関数を使わず、LIBファイルを使おうと考えています 以上、宜しくお願い致します。

  • .cpp を再度 作り出すことと、.obj ファィルはどのように使うの?

     コンパイラーは Borland C++Compilerに GUIパッチをあてた、"C Pad for Borland C++Compiler"で 作業をしています。  コンパイルをすると、 .cpp .obj .exeの 3つのファィルができますが、.cpp のファィルが どういう訳か わかりませんが、見つかりませんでした。  それで、.exeの訂正が出来ないので、.exeを 再度 コンパイルしてみたのですが、この結果は、2行ほどの文字化けが出てきただけです。どうすれば、.cpp を再度 作り出すことが出来るのでしょうか?  もうひとつは、.obj ファィルはどのようにして、利用できるのでしょうか?文字からして オブジェクトのファィルらしいかな?とはおもいますが、このコンパイラーが、 cのみでなく、c++を作るということはかいてありましたが、さしあたって、使い道が分かりません。同時に作り出すということだけを 認識していればいいことなのでしょうか?  以上2点について、お伺いします。

  • .libファイルのリンク

    Visual C++ 2005 Express Edition を使ってプログラミングの勉強をしています。 自分でdllを作りそれを他のプロジェクトにリンクしようとしたのですが、 .libファイルをプロジェクトに追加したところ、ダイアログボックスが出現し、 拡張子".lib"を含むビルドファイルに対するカスタムビルド規則が見つかりませんでした。 この拡張子のファイルをビルドするためのカスタムビルド規則を定義する、新しい規則ファイルを作成しますか? と聞かれました。 意味が分からないので "いいえ"にしたところ、コンパイルエラーになりました。 この場合はどうしたらいいのでしょうか??

  • VC++(VS)でコンソールアプリ(複数ファイルからなる)を作成したい

    マイクロソフト社のVC++(Visual Studio 2008)で コンソールアプリケーションを作成しようとしております。 ファイルは複数ファイルからなり、 mainprogram.cpp -> 実行ファイル(mainprogram.exe) subprogram1.cpp -> オブジェクトファイル(subprogram1.obj) subprogram2.cpp -> オブジェクトファイル(subprogram2.obj) ・・・以下続く のように 1)サブプログラムをobjファイルとしてコンパイル 2)メインプログラムをコンパイルしてobjファイルとリンクし、   実行ファイルを作成する というような作業を行いたいと考えております。 以前はLinuxの環境でg++、makeを利用して このような構成のコンソールアプリケーションを作成しておりました。 が、VCに移行するに当り、どのようにプロジェクトファイル等を 構成して良いか分からず、出だしでつまづいております。 VCにもコマンドラインでコンパイルする方法 (cl, nmakeを使うんでしょうか。。。)があるみたいですが、 これらの手法について書かれている 書籍、サイト等を探すことが出来ないでおります。 VCに関して、このような使用法に対する解説がなされている書籍、 もしくはサイト等をお教え願えませんでしょうか? 宜しくお願い申し上げます。

  • *.libを作成する方法

    自作のC++のライブラリを使おうとしましたが、 ある環境で、Cしかコンパイルできない環境だったので、 C関数でワンクッションおいた、Cのライブラリを作りたいのです。 しかし、libファイルの作り方がわかりません。 makeとかで作る方法が知りたいです。 C++のライブラリは、統合環境で作成したライブラリです。 そのライブラリ名はMyCPP.libとし、ヘッダはMyCPP.hppとします。 ワンクッション用のファイルは one.cppとし、ヘッダはone.hとします。 *** one.cpp int c_add(int a, int b) { MyCPP x return x.Add(a, b); } *** one.h extern "C" { int c_add(int a, int b); } cl one.cppとすると、エントリポイントがありませんと表示されます。 目的は one.libを作成したいです。

  • 分割コンパイルのリンク時のファイル名の指定法

     Visual Studioコマンドプロンプト(2010)で、分割コンパイルを試みています。自分で調べて、次のことまでは分かりました。 ソースファイル “1.c” “2.c” “3.c” がある。それぞれ、リンクはせずにコンパイルだけ行うには、 “cl /c 1.c”で、“1.obj”が生成する。 “cl /c 2.c”で、“2.obj”が生成する。 “cl /c 3.c”で、“3.obj”が生成する。 これらを、次のようにリンクすると、 “link 1.obj 2.obj 3.obj” ↓ “1.exe” が生成する。  この最後のリンクのところで、“1.exe”でも“2.exe”でも“3.exe”でもない別のファイル名(“program.exe”など)に、実行ファイルを指定したいのですが、 “link /?” を見てみると、どのオプションを指定すればいいか分かりません。どなたか、ご教授ください。お願い致します。

  • .exeファイルが開けません

    Visual C++ 2005 Express Editionを使用しています プログラムをコンパイルしてそのEXEファイルを友達に渡したんですが このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。 アプリケーションを再度インストールす事により問題が解決する場合があります。 と言うエラーが出るらしく実行できません 調べてみたらランタイムライブラリをマルチスレッド(/MT)にすると直るということはわかったんですが マルチスレッド(/MT)にするとエラーが出てしまいます main.obj : error LNK2005: "public: int __thiscall std::ios_base::width(int)" (?width@ios_base@std@@QAEHH@Z) は既に msvcprtd.lib(MSVCP80D.dll) で定義されています。 LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。 libcpmtd.lib(xmbtowc.obj) : error LNK2001: 外部シンボル "__CrtDbgReportW" は未解決です。。 libcpmtd.lib(cin.obj) : error LNK2001: 外部シンボル "__CrtDbgReportW" は未解決です。 libcpmtd.lib(xmbtowc.obj) : error LNK2001: 外部シンボル "__malloc_dbg" は未解決です。 libcpmtd.lib(xdebug.obj) : error LNK2019: 未解決の外部シンボル __free_dbg が関数 "void __cdecl operator delete(void *,struct std::_DebugHeapTag_t const &,char *,int)" (??3@YAXPAXABU_DebugHeapTag_t@std@@PADH@Z) で参照されました。 libcpmtd.lib(xmbtowc.obj) : error LNK2001: 外部シンボル "__free_dbg" は未解決です。 C:\C++\計算\Debug\計算.exe : fatal error LNK1120: 外部参照 4 が未解決です。 エラーは文字数の関係で大幅に削ってあります 作成したプログラムも上げておきます http://www.uploda.net/cgi/uploader4/index.php?file_id=0000008742.exe よろしくお願いします

  • MISTのLAPACKの環境設定ができない

    こんにちは.質問させていただきます. 画像の主成分分析を行いたいと思っており,調べたところMISTというライブラリを用いれば用意にできるそうなので,早速使ってみました. しかし行列演算を行うためのLAPACKというものがうまく環境設定できていないようで,大量のエラーが出て困っています. 手順は下のURLのpdfに従い行っておりました. http://mist.suenaga.cse.nagoya-u.ac.jp/pdf/MIST_no_susume.pdf 環境設定もこのpdfの19ページに従い行いました. 上記のpdfのとおりにサンプルプログラムを順番に動かしてみたら,画像の入出力などは正常にできました. が,17ページのサンプルプログラムを実行しようとすると,以下のようなエラーが大量に出てしまいます. ===================================================== 1>MSVCRT.lib(ftol2.obj) : error LNK2005: __ftol2 は既に libF77.lib(ftol2.obj) で定義されています。 1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __initterm_e は既に MSVCRT.lib(MSVCR100.dll) で定義されています。 1>LIBCMT.lib(crt0dat.obj) : error LNK2005: _exit は既に MSVCRT.lib(MSVCR100.dll) で定義されています。 (中略) 1>LIBCMT.lib(errmode.obj) : error LNK2005: ___set_app_type は既に MSVCRT.lib(MSVCR100.dll) で定義されています。 1>LINK : warning LNK4098: defaultlib 'MSVCRT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。 1>LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。 1>C:\Documents and Settings\(ユーザ名)\My Documents\Visual Studio 2010\Projects\test\Debug\test2.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。 ===================================================== 使用環境はWindows XP,Visual Studio2010です. プログラミングは初心者です. .NETというものがよくわからないので,Visual Studioを使っているのですが,これが問題でしょうか?Visual Studioではできないのでしょうか?(画像の入出力などは正常に処理できたので,LAPACKの設定がうまくできていないだけだと自分では思っているのですが・・・) どなたか詳しい方がいらっしゃいましたら,教えてください. よろしくお願いいたします.

専門家に質問してみよう