というか、ものすごく現象を説明しづらいです。
C#を使ってるときだと、
一つのソリューション内で
ソリューションA
+--クラスライブラリB(C#) (DLLを生成)
+--フォームC(C#) (exeを生成)
とかって構成の時は、
フォームCからクラスライブラリBを参照するだけで、ビルド・デバッグ共にうまくいくわけさ。
// .NETのバイナリはこういうところが便利だと思う。
.NETを一切使わずに、cとかC++とかでnativeのWIN32だけとかのDLLを作って、それを使うWIN32アプリがあるときを想定しますと
ソリューションD
+--DLLプロジェクトE
+--exeプロジェクトF
みたいな構成になるわけです。
で、このとき、exeプロジェクトFからDLLプロジェクトEを参照設定するわけですね。
1.コンパイルするときは、
#include "../DLLプロジェクトE/hogehoge.h"
のように相対パスで指定すれば、コンパイルできる。
2.リンク時は、参照設定したときにリンカオプションに自動でDebug/Releaseに応じたlibファイルが追加されるので、何も考えなくてもリンクできる。
3.デバッグ実行時、DLLプロジェクトE.dllが見つかりません的なエラーが出る。
と、こういう寸法なわけです。
一々DLLをコピーするのは面倒なので、
ビルド後オプションに copy コマンドを追加するっていう手もある。
ビルド後イベントに、
copy "$(SolutionDir)$(ConfigurationName)\DLLプロジェクトE.dll" "$(TargetDir)"
copy "$(SolutionDir)$(ConfigurationName)\DLLプロジェクトE.pdb" "$(TargetDir)"
って打ち込む。(DLLプロジェクトEは当該DLL名に置き換えてね)
ところがどっこい。
ビルド後オプションの設定だと、F7とかでビルドしたときにはコピーされるんだけど、直接F5とかで実行して、「ビルドされていませんビルドしますか?」って確認されて自動でビルド→実行っていうプロセスを踏むときのビルドだと、copyコマンドが発行されないらしい、ということを知りました。先ほど。
参照設定で(プロジェクトの参照ではなく)dllの参照を設定すれば、自動コピーしてくれるようですが、それだとDebugビルドとReleaseビルドを区別できないですよね。
困りましたので、すずめ的には以下のように設定することにしています。
exeプロジェクトFのプロパティ→構成プロパティ→全般の出力ディレクトリが、
Debugビルド時はDebug, Releaseビルド時はReleaseになっているので、ここをDebug,Releaseともに「$(SolutionDir)$(ConfigurationName)」にする。
// 中間ディレクトリの方はそのままにしておきます。
いえ、実はDLLプロジェクトEの同項目のデフォルトの設定が「$(SolutionDir)$(ConfigurationName)」なのです。
どういうことかってーと
フォルダ構成はもともと
ソリューションDフォルダ(D)
+--DLLプロジェクトEフォルダ(E)
| +--Debug(E-d)
| +--Release(E-r)
+--exeプロジェクトFフォルダ(F)
| +--Debug(F-d)
| +--Release(F-r)
+--Debug(G)
+--Release(H)
っていう階層構造になってるですね。
Visual Studioオリジナルの設定だと、DLLプロジェクトEは、ビルド中に生成される中間ファイルはE-dとかE-rに作るんだけど、最終的な出力であるDLLファイル(とデバッグ用のpdbファイルとかも)はGとかHのソリューションフォルダ直下のDebug/Releaseに生成するわけさ。
翻ってexeプロジェクトFは、中間ファイルも最終的な出力ファイル(exe,pdb)もともにF-dとかF-rに生成するわけね。
さっきのビルド後オプションの設定は、copyコマンドでGにあるdll,pdbをF-dにcopyするっていう方法だったけど、そんなまだるっこしいことしないで、exeプロジェクトFでもDLLプロジェクトEと同じようにビルド中の中間ファイルはF-dに、出力ファイルexe,pdbはGに吐き出せばいいじゃないですか、という寸法なのです。
こうすれば、DLLもデバッグできるし、嬉しいね、と。
それが良いのかどうかは置いといて。
元々はVisual Studioが自動でコピーしてくれれば良いだけの話だったんだけど、ね。
もっと良い方法があれば是非教えてくだされ。
PR