VC++6.0上で複数プロジェクトをビルドしたときのリンクエラーについて

このQ&Aのポイント
  • VC++6.0上で複数の関連するプロジェクトをビルドすると、DLLに新しく追加したClassのみがリンクエラーになる問題が発生しています。
  • 新しく追加したClassはDLLの内部で使用されており、Mainプロジェクトから直接呼ばれるClassではありません。また、Classの使用箇所をDLLのソースからコメントアウトすると、リンクエラーは解消されます。
  • 現在の設定内容が十分に理解できておらず、問題の原因が特定できていません。MainプロジェクトからDLLを呼び出すための設定が正しく行われているか確認することをおすすめします。
回答を見る
  • ベストアンサー

複数プロジェクトをビルドしたとき、DLLに新しく追加したClassのみがリンクエラーになる

VC++6.0上で、複数の関連するプロジェクトをすべてビルドしたときのリンクエラーで悩んでいます。 現在、ワークスペースには、以下の複数のプロジェクトがあります。 ・Mainとなるプロジェクト ・上記のMainプロジェクトがDependしている、DLLのプロジェクト 問題は、DLLプロジェクトに新しいClassを追加したところ、単体でビルドすると成功するにもかかわらず、MainプロジェクトをActiveにしてリビルドしたときに、新しく追加したClassだけが下のように未解決にされてしまうということです。 ”error LNK2001: 外部シンボルXXX(追加したクラスのコンストラクタ)は未解決です” このClassはDLLの内部で使用されており、Mainプロジェクトから直接呼ばれるClassではありません。また、このClassの使用箇所をDLLのソースからコメントアウトすると、リンクエラーは解消されます。 VC++に不慣れかつ、他人の作ったプロジェクトなこともあり、現在の設定内容がいま一つわかっていないところがあります。問題はそのあたりだと思うのですが、はっきりしません・・・。 調べてわかっていることは、以下です。 ・Mainプロジェクトから呼ばれるDLLのHeaderファイルにはパスが通っている。 ・Mainプロジェクトから呼ばれるDLLのLibraryにはパスが通っている。また、#pragmaによりリンクされている。 ・Mainプロジェクトから呼ばれるDLLにはパスが通っている。 ここを確認してみたらどうか?など、ヒントをもらえたらありがたいです。 よろしくお願いいたします。

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

  • ベストアンサー
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.2

具体的な状況が分からないので推測ですが、 Mainから使用しておらずDLLからもexportしていないのに、 「Mainの方でそのヘッダを(間接的に?)includeしてしまっている」から、 Mainの方でもそのClassが定義されたことになってしまい、 そのの実体がないと言われてると言うことはありませんか。 ヘッダの依存関係がうまく整理できてないせいかな?という印象です。 無闇にincludeされてませんか。 本当にDLL内のみでしか使わず、Mainと無関係ならば、 Mainがincludeするヘッダファイルでは、そのClassが定義されないようにしてください。 代替策は、そのクラスもDLLからexportすることですが、 どちらが適しているかは実際のクラスの役割にもよるかと。

simanoha
質問者

お礼

おっしゃる通り、MainがincludeしているDLLのヘッダに、errorが起きていたソースのヘッダがincludeされていました。 問題のヘッダのinclude箇所を削除するなど、依存関係をきれいにしたところ、無事にビルドが通って非常にすっきりしました。 どうもありがとうございました。

その他の回答 (1)

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.1

自己解決結果を補足にどうぞ。

simanoha
質問者

補足

> MrBan さん ありがとうございます! 自己解決しました結果は以下です。 MainとなるプロジェクトのFileViewを確認したところ、 DLLの(問題のClassを呼び出してる)ソースが「Source Files」に含まれていることに気付きました。 そこで試しに、同「Source Files」を右クリックして、「Add Files to Folder」で、問題のClassを追加したところ、無事にビルドが通るようになりました。 というわけで、直接の問題は解決したのですが… DLLのClassをわざわざMainプロジェクトのソース管理に加えないとビルドが通らないというのは、なんだか納得できません。 前任者が事情があってそのように設定しているのか、だとしたらVC++にどのような設定をしているのか?と疑問は残ってしまっています…。

関連するQ&A

  • 1つのDLLにソースを1500個ほど追加してビルドを行なったところ..

    1つのDLLにソースを1500個ほど追加してビルドを行なったところ vc60.idbが 35MBぐらいになり、以下のようなエラーが表示されてビルドが止まります。 環境:Visual C++ 6.0 x:\xxxx.cpp(19) : fatal error C1073: インクリメンタル コンパイルを伴う内部エラーが発生しました(コンパイラ ファイル '.\main.c', 行番号 629) xxxx.CPP vc60.idb削除すると、エラーが表示されなくなり最後までビルドが行なわれます。 よい知恵などありましたら、よろしくお願いいたします。

  • ビルドする時のエラー。(初心者です)

    リンク中... LIBCD.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です Debug/MousMov.exe : fatal error LNK1120: 外部参照 1 が未解決です。 link.exe の実行エラー というエラーがでます。 何がいけなくて対処方法はどうすればいいのでしょう。 初めてビルドするときは、エラーは何も出ないのですがもう一回するとこのエラーがでます。どうすればいいんですか?よろしくお願いします。

  • アンマネージドC++のDLLを使うと、wchar_t型のみビルドエラー

    アンマネージドC++のDLLを使うと、wchar_t型のみビルドエラー アンマネージドのC++(VC++6.0)で作成したDLLを、マネージドのC++(VisualStudio2008)で利用したいと考えています。 しかし、DLL中の関数のうち、wchar_t型を返す関数のみビルドが通らずにerror LNK2028が表示されます。 試しに、アンマネージドのC++プロジェクトからこのDLLを利用したところ、問題なくビルドが通りました。 何かマネージドのプロジェクトに必要な設定が抜けているのでしょうか。 (DLLは_UNICODEを指定しています。) それぞれ、以下のように記述しています。 よろしくお願いいたします。 // アンマネージドC++ (テスト用ですので、関数内の処理は正確なものではありません) class DLL_EXPORT MyClass { public: char CharTest(); wchar_t WCharTest(); }; char MyClass::CharTest() { char c = 'a'; return c; } wchar_t MyClass::WCharTest() { wchar_t wc = L'a'; return wc; } // マネージドC++ int main(array<System::String ^> ^args) { MyClass *p = new MyClass(); p->CharTest(); // OK p->WCharTest(); // ビルドエラー return 0; } // エラー内容 エラー 1 error LNK2028: 未解決のトークン (0A000008) "public: wchar_t __thiscall MyClass::WCharTest(void)" (?WCharTest@MyClass@@$$FQAE_WXZ) が関数 "int __clrcall main(cli::array<class System::String ^ >^)" (?main@@$$HYMHP$01AP$AAVString@System@@@Z) で参照されました。 UnManagedDLLUserFromManaged.obj UnManagedDLLUserFromManaged

  • DLLからEXEのクラスを呼び出すとリンクエラーになります。

    私は昔VC++6.0を少し触っただけの初心者に近い状態のレベルです。 作っているプログラムは、1つのソリューションの中にEXE実行するプロジェクトとDLLを作るプロジェクトの2つプロジェクトを含んでいます。 DLL側からEXEのクラスを使用すると、ビルド時にリンクエラーになります。LNK2019でシンボルのエラーなのですが、なぜそうなのか?がわかりません。 ご教授いただけますでしょうか。 <ソリューションの構成> A ソリューション  Aプロジェクト(.exe) AAクラス ERR親クラス ← ERR子クラスの継承 Bプロジェクト(.dll) 静的リンク(.defファイル使用) BAクラス BAクラスの実装 {  try {   throw ERR子クラス } catch(ERR子クラス) { } } やりたいことは、BプロジェクトにあるERR子クラスをBプロジェクトと Cプロジェクトの両方で使用したいです。 ビルド時に上のBAクラスのERR子クラスのところでコンパイルはとおるのですが、リンクエラーになります。エラーコードはLNK2019です。 何が足りないのでしょうか? dllからexeのクラスを呼び出すようなことはできないのでしょうか? このやり方自体に問題があり、他の方法にする方がいいですか? ERR親クラス、ERR子クラスともヘッダー定義があり。 CAクラスのヘッダー定義内でinclude宣言しています。 versionはVC2003++です。 よろしくお願いします。

  • BCBで作成したDLLを、VC++で静的リンクさせる方法

    BCBで作成したDLLを、VC++で静的リンクさせる方法 Borland C++ Builderで作成したDLLを、VC++アプリケーションで利用できるように LIBファイルに変換したいのですが、上手くいきません。 下記の手順を踏みました。 1. BCBでDLL作成   「VC++スタイルのDLL」で作成、   「VCLを使う」「CLXを使う」「マルチスレッドを使う」はチェックせず 2. コマンドラインで「IMPDEF.exe」を使用して、dllからdefファイル作成   (IMPDEF.exeは、\Borland\CBuilder6\Binに格納されていた) 3. コマンドラインで「LINK.exe」「LIB.exe」を使用して、defからlibファイル作成   (LINK.exeとLIB.exeは、\Microsoft Visual Studio\VC98\Binに格納されていた) 4. VC++プロジェクトファイルを保存したフォルダに、DLLファイルとlibファイルをコピー 5. VC++の「プロジェクト」-「設定」-「リンク」-「オブジェクト/ライブラリモジュール」に   作成したlibファイルを追加 VC++プロジェクトをビルドすると、下記のエラーメッセージが表示されます。 ///////////////////////////////////////////////////////////////////////////////// dllread.obj : error LNK2001: 外部シンボル "__imp__(関数名)@0" は未解決です LIBC.lib(wincrt0.obj) : error LNK2001: 外部シンボル "_WinMain@16" は未解決です Release/dllread.exe : fatal error LNK1120: 外部参照 2 が未解決です。 link.exe の実行エラー ///////////////////////////////////////////////////////////////////////////////// BCBとVC++のバージョンは、下記の通りです。 BCB Professional 6.0 VC++ 6.0 ちなみに、同じDLLを動的リンクで利用することは出来ました。 初心者の質問で申し訳ございませんが、解決策が分かる方がいらっしゃいましたら 教えていただけないでしょうか?

  • VC++での複数プロジェクトのリンクの方法

    VC++2005にてアプリケーションを作成しています。 MFCで別々のPCから新規作成したプロジェクトを、 一つのソリューション内に統合し、ビルドすることでリンクさせ、 一つのアプリとして動作させたいのですが、方法が分かりません。 具体的に言うと、 ・1機能につき1プロジェクト ・ソリューション内に複数プロジェクトが存在 ・機能別にリソースを作成 なぜプロジェクト分割させるかというと、 複数で作成したソースを統合させる際に、 「追加」⇒「既存のプロジェクト」にて、ソースファイルとリソースファイルを、 一括して統合させたいからです。 このような開発の仕方をしたことがないので、この方法が正しいかどうか 分かりませんが、解決策または、より理想的な作成方法をご存知の方おられましたら、 お手数ですがなるべく当方のような初心者でも分かるレベルで、ご教授お願い致します。

  • ビルドエラー LNK1201

    開発環境は、VS.net 2003 です。 あるプロジェクトについて、デバッグを終了して、再度ビルドすると 「LINK : fatal error LNK1201: プログラム データベース 'c:\myprog\Debug\xxx.pdb' に書き込めません。ディスク容量不足、パスが無効、また十分な特権がない可能性があります。」 と表示され、ビルドが完了しません。 ソリューションを開いたままでは、改善されず。 他のソリューションを開いても、改善されず。 VSを終了すると、改善されます。 なので、デバッグ後は、一度VSを終了させてから、ビルドし直しています。

  • OpenCV2.0or2.1でスタティックリンクライブラリをビルドした

    OpenCV2.0or2.1でスタティックリンクライブラリをビルドしたい 表題の件ですが、MFCをスタティックリンクさせてビルドしているアプリケーションだと、OpenCVをインストールしたときに出来上がるライブラリではエラーの出るものがあります。そのエラーはMFCをDLLでビルドすると出ません。なのでOpenCVをスタティックライブラリでビルドすることで解決しそうなのですが、OpenCVの場合これがかなりややこしいです。 アプリケーションのソリューションにOpenCVの各ライブラリのプロジェクトを挿入する方法も試みたのですが、依存関係が複雑で解決しきれませんでした。 ということでOpenCVのスタティックリンクライブラリのビルド方法を知りたいのですが、Webにある情報ではうまくいかないものが多いので、いろいろな見識をうかがわせていただければ幸いです。 ■環境 VisualStudio2008Professional+OpenCV2.0or2.1+CMake

  • dllを参照追加をするときのパスについて

    VS2015で開発をしていてサードパーティ製のツールを使用しています。 そのうちのいくつかのdllをプロジェクトに参照追加しています。 端末(1)で新たにdllを参照追加しました。 端末(2)でフォルダ階層の違う場所でソリューションを開くと さきほどのプロジェクトの参照追加したdllに参照できないマークがつき、コンパイルするとワーニングが出力されます。 これはなぜでしょうか? また、以前から追加されているdllの「.csproj」内のパスは 端末(1)にはないディレクトリとなっているのですが、エラーになりません。 このプロジェクトファイル以外にもパスを管理しているものがあるのでしょうか? ご存知の方がいらしたらご教授頂きたいです。

  • IEコンポーネント使用でリンクエラー

    Windows XP SP2 + VC++6.0 + IE6 SP2 で IEコンポーネントを使用するプログラムを作成しています。 MFC は使用していません。 このプロジェクトをビルドするとリンクエラーが発生します。 *****.obj : error LNK2001: 外部シンボル "_IID_IHTMLFormElement2" は未解決です *****.obj : error LNK2001: 外部シンボル "_IID_IHTMLInputElement" は未解決です 「mshtml.libをリンクすべし」と言っているサイトがあったのですが mshtml.lib なるファイルが私の環境にはありません。 どこかで入手できるものなのでしょうか。探しましたがわかりませんでした。 また、「mshtml.tlbをインポートすべし」というサイトもあったのですが インポートしても同じリンクエラーが発生します。 ちなみに使用している各ファイルの日付は以下の通りです。 MsHTML.h 2005/04/14 mshtml.tlb 2004/08/05 どうかアドバイスをお願いいたします。