プロが教える店舗&オフィスのセキュリティ対策術

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にはパスが通っている。

ここを確認してみたらどうか?など、ヒントをもらえたらありがたいです。
よろしくお願いいたします。

A 回答 (2件)

具体的な状況が分からないので推測ですが、


Mainから使用しておらずDLLからもexportしていないのに、
「Mainの方でそのヘッダを(間接的に?)includeしてしまっている」から、
Mainの方でもそのClassが定義されたことになってしまい、
そのの実体がないと言われてると言うことはありませんか。

ヘッダの依存関係がうまく整理できてないせいかな?という印象です。
無闇にincludeされてませんか。
本当にDLL内のみでしか使わず、Mainと無関係ならば、
Mainがincludeするヘッダファイルでは、そのClassが定義されないようにしてください。

代替策は、そのクラスもDLLからexportすることですが、
どちらが適しているかは実際のクラスの役割にもよるかと。
    • good
    • 0
この回答へのお礼

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

どうもありがとうございました。

お礼日時:2009/05/07 14:25

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

この回答への補足

> MrBan さん
ありがとうございます!
自己解決しました結果は以下です。

MainとなるプロジェクトのFileViewを確認したところ、
DLLの(問題のClassを呼び出してる)ソースが「Source Files」に含まれていることに気付きました。
そこで試しに、同「Source Files」を右クリックして、「Add Files to Folder」で、問題のClassを追加したところ、無事にビルドが通るようになりました。

というわけで、直接の問題は解決したのですが…
DLLのClassをわざわざMainプロジェクトのソース管理に加えないとビルドが通らないというのは、なんだか納得できません。
前任者が事情があってそのように設定しているのか、だとしたらVC++にどのような設定をしているのか?と疑問は残ってしまっています…。

補足日時:2009/05/01 17:28
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!