忍者ブログ
すずめと一緒に踊りませんか
ブログ内検索
話題ごと
WirelessFreedom
LinkStation (ls-gl)
イーサネットコンバータ
最新コメント
最新トラックバック
カレンダー
10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
バーコード
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

       
Visual Studio 2005/2008のデフォルトの設定で唯一使いにくいこと。
自前でDLLを開発して、それを使用するexeも一緒に開発するときに、参照が最後まで機能してくれないこと。
というか、ものすごく現象を説明しづらいです。

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
       
■ この記事にコメントする
お名前
タイトル
文字色
URL
コメント
パスワード
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
■ コメント一覧
■ この記事のトラックバック
この記事にトラックバックする:
オレオレ電波 HOME もっと想定の範囲外
Copyright © すずめのおどりあし All Rights Reserved
Powered by ニンジャブログ  Designed by ピンキー・ローン・ピッグ
忍者ブログ / [PR]