中間ディレクトリの指定に $(ParentName) が含まれるとき

[戻る]
tani 2010/06/10(木) 11:16:56
Microsoft Visual C++ 2008 のビルドで困っています。

まずソリューションエクスプローラからプロジェクトのプロパティページを
開いて [構成プロパティ/全般/中間ディレクトリ] に
$(PlatformName)\$(ConfigurationName)\$(ParentName) を指定します。

このとき [構成プロパティ/C/C++/出力ファイル/オブジェクトファイル名]
はデフォルトの $(IntDir)\ が指定されています。

そしてそのプロジェクトをビルドすると、(ソリューションエクスプローラの
各フォルダにあるソースファイルに対応する) オブジェクトファイルが
すべて同じディレクトリに出力されてしまいました。

このとき BuildLog.htm を見るとコンパイルオプションに 1 つの
/Fo"Win32\Debug\parent\\" が指定され、すべてのソースファイルがまとめて
コンパイルされていることが分かりました。

ソリューションエクスプローラからソースファイルを選択してコンパイルする
と期待通り $(ParentName) にそのオブジェクトファイルが出力されるのですが、
プロジェクトを選択してコンパイルするとオブジェクトファイルがすべて同じ
ディレクトリに出力されて期待通りになりませんでした。

この問題を解決する方法はあるでしょうか?

仲澤@失業者 2010/06/10(木) 11:40:55
問題点が理解できませんでした。
最終的に何がしたいのかを書いたほうが良いかもしれません。

ちなみに自分は*.obj等の中間ファイルと*.exe等の最終的な実行ファイル
を分離するため

出力ファイル:..\Debug
中間ファイル:Debug

にしてます。デフォルトのままだと激しくうっとおしいので(vv;)。

ryo 2010/06/10(木) 12:05:25
2005以降、
デフォルトなら、中間ファイルと実行ファイルの作成されるフォルダは
別々になっていませんか?

特にいじってないのですが、

(ソリューション)-(プロジェクト)-(debug)-中間ファイル
         -(debug)-実行ファイル
         -ソリューション.sln

って形になる

aetos 2010/06/10(木) 12:13:05
# 中間ディレクトリなんてどこでもいいじゃない…と思うんだけど。

ソースファイルに対して $(ParentName) は、ソリューション エクスプローラー上で見
えている仮想フォルダの名前です。
つまり、

ソリューション
└プロジェクト
 ├ソース ファイル
 |└Hoge.cpp
 └ヘッダー ファイル
  └Hoge.h

となっていたら、(Hoge.cpp が実際になんという物理ディレクトリにあるかは関係な
く)、Hoge.cpp の ParentName は「ソース ファイル」です。
この認識はあってますか?

Hoge.cpp が $(ProjectDir)\Hoge\Hoge.cpp にある時に、Hoge.obj を $(ProjectDir)
\$(PlatformName)\$(ConfigurationName)\Hoge.obj に出力したかったら、ソリューショ
ン エクスプローラー上でも「新しいフィルタ」で Hoge という仮想フォルダを作らなけ
ればなりません。

その他諸々、デフォルトの設定を変えなければならない個所が多岐に渡り、結局俺はこ
れを実現できませんでした。

そこまでしてこだわるものでもないと思うんですけどね…

aetos 2010/06/10(木) 12:14:40
まちがい。

> Hoge.cpp が $(ProjectDir)\Hoge\Hoge.cpp にある時に、Hoge.obj を $(ProjectDir)
\$(PlatformName)\$(ConfigurationName)\Hoge.obj に出力したかったら、

Hoge.cpp が $(ProjectDir)\Hoge\Hoge.cpp にある時に、Hoge.obj を $(ProjectDir)
\$(PlatformName)\$(ConfigurationName)\Hoge\Hoge.obj に出力したかったら、

です。

なお、入力ファイル名のディレクトリの最後のコンポーネント(上記の例で言えば物理
パスでのディレクトリ Hoge)を取得するようなマクロはないようですね。

仲澤@失業者 2010/06/10(木) 12:22:38
>2005以降、
>デフォルトなら、中間ファイルと実行ファイルの作成されるフォルダは
>別々になっていませんか?

ありゃっ 2003の話じゃなかったのねm(__)m。

tani 2010/06/10(木) 12:56:14
aetos 様

> (Hoge.cpp が実際になんという物理ディレクトリにあるかは関係な
> く)、Hoge.cpp の ParentName は「ソース ファイル」です。
> この認識はあってますか?

はい。その通りです。

私の場合は nsA::Hoge と nsB::Hoge というクラスを実装する場合は

src/nsA/Hoge.cpp
src/nsB/Hoge.cpp

のように名前空間とディレクトリを同じ構造にしています。
このときプロジェクトの設定も以下のようにしてます。
慣れてしまえばこのような設定はそれほど面倒ではありません。

ソリューション
└プロジェクト
 ├ nsA
 | └ Hoge.cpp
 └ nsB
   └ Hoge.cpp

このとき質問のような設定でビルドした場合、オブジェクトファイルが

Win32/Debug/nsA/Hoge.obj
Win32/Debug/nsB/Hoge.obj

のようになってほしいのですが、両方のオブジェクトが
Win32/Debug/nsA/Hoge.obj になって、片方のオブジェクトしかない
のでリンクに失敗してしまいます。
デフォルトの設定でも同じように失敗してしまいます。

ディレクトリを分ける別の理由として、あるツールを使用して後で
オブジェクトファイルを参照するのですが、このときソースファイルと
同じ構造でディレクトリが分かれているとソースファイルとの対応が
とりやすいということがあります。

古いスレッドには追加発言できません。