プリコンパイルヘッダの扱い方について

[戻る]
める 2005/07/26(火) 21:13:41
簡単な事かもしれませんが、どうにも解決出来ないので順を追って・・・

プロジェクトのフォルダがソースとヘッダでいっぱいになってきたため、
srcフォルダとincフォルダに分けて格納しました。そして、
プロジェクト(P)→設定(S)で「プリコンパイル」及び「リソース」にある
インクルードのフォルダ指定と、ツール(T)→オプション(O)でディレクト
リのパス指定を行いました。

ここでビルドを行うと、なぜか「debug版」の場合だけ

「j:\makescn\debug\vc60.pdb は、このプリコンパイル済みヘッダーが作成されたとき
に使用された pdb ファイルではありません。プリコンパイル済みヘッダーを再作成してください。」

とのエラーが出ます。release版はエラーはでませんでした。
(ビルド前にdebug/releaseフォルダは削除していない。)
ここで、debug/releaseフォルダを削除して、再度リビルドすると

debug/release共に

fatal error C1083: プリコンパイル済ヘッダー ファイルがオープンできません。
'Release/MakeScn.pch': No such file or directory

fatal error C1083: プリコンパイル済ヘッダー ファイルがオープンできません。
'Debug/MakeScn.pch': No such file or directory

と出てしまいます。(cppファイルの分だけ。)エラーをクリックすると、
各ソースの「#include "stdafx.h"」に部分を指すのですが、
stdafx.hは、前出のincフォルダの中にあり、パスも切れてる筈なのですが・・・

ちなみに、プロジェクトワークスペースからは、一度ファイルを取り外し、
src/incフォルダから再度追加しました。

設定の「C/C++タブ」にある「プリコンパイル済みヘッダの作成」を
選択しても、各cppが*.pchを出力しようとしている旨のメッセージが出て
(私には理解できません。すいません)結局*.pchは作られません。

長くなってしまいましたが、何が原因なのでしょうか?
宜しくお願い致します。

RAPT 2005/07/26(火) 23:47:25
念のため確認ですが、文章からして、環境はVC++6かと思われますが、
まずは、環境をきちんと明示してください。

それから、inc/srcフォルダには、それぞれどのようなファイルが含まれているのでしょうか。
inc が *.h、src が *.cpp? それ以外のファイルはデフォルト?

あと細かいところですが、「パスも切れてる」の表現は、人によって、
「パスが通っていない」「パスが通っている」と正反対の解釈がなされる場合が
あるので、気をつけた方が良いようです。

# 私も仕事で会話する時は、その場の流れによって使い分けていますが、
# こういった掲示板などでは、「パスが切れている」=「パスが通っていない」
# と解釈する事にしています。
## 余計なお世話かもしれませんが。

外していたらすみませんが、とりあえず、
#include "../inc/xxxx.h"
とかすれば良いかと思われます。

める 2005/07/27(水) 01:51:20
すいません。説明足らずでした。
環境は仰る通りVC6.0です。
パスは「通してある」と言えば良かったんですね。

incフォルダには*.hファイル及びstdafx.hとresource.hが入ってます。
srcフォルダも同様に*.cppファイルとstdafx.cppを入れました。
以下の通りです。

aaaa-------src・・・全ての*.cppファイル
|  |----inc・・・全ての*.hファイル
|  |----res・・・各種アイコン等のリソース
|   
aaaa.dsw
aaaa.dsp
aaaa.rc
aaaa.plg
aaaa.ncb
aaaa.opt
aaaa.clw

ご指摘されたパスの件ですが、
・ツール(T)→オプション(O)→ディレクトリタブのインクルード及びソース
・プロジェクト(P)→設定(S)→C/C++タブ→カテゴリ:プリプロセッサのインクルードパス
・プロジェクト(P)→設定(S)→リソースタブ:インクルードパス
は全て設定しました。(debug/release共に)

>#include "../inc/xxxx.h"
やってみましたが変わりません。

1つ怪しいかな?と思ってるのが、
私はCommonHeader.hと称して、全てのヘッダファイルを一箇所で定義してます。
各cppファイル(stdafx.cppを除く)のインクルード定義としては、

#include "stdafx.h"
#include "CommonHeader.h"

の2行のみ定義してますが、コレが悪さしてる可能性ってあるんでしょうか?
このあたりも../inc/つけてみたり、各ソース毎にちゃんとヘッダ指定したり
やってみたのですが・・・また色々自分でやりつつ皆さんの回答お待ちします。

以上宜しくお願いします。

PATIO 2005/07/27(水) 16:53:53
MakeScn.pchがRelease、Debugの下にないのではないですか?
stdafx.cppがコンパイルされるとプリコンパイルヘッダがプロジェクト名.pchの名前で
それぞれの出力ディレクトリ内に作成されます。
そしてstdafx.cpp以外のcppファイルのコンパイル時にはそのpchファイルが使用されます。
もしかしてプロジェクトのファイルからstdafx.cppが外れているのでは?
IDEのFileViewにstdafx.cppは入っていますか?

める 2005/07/27(水) 20:28:57
PATIOさん
>プロジェクト名.pchの名前でそれぞれの出力ディレクトリ内に作成されます。
それは承知してます。また出力ディレクトリも、

プロジェクト→設定→一般タブ&デバッグタブ

でdebugもreleaseも指定しています。

>IDEのFileViewにstdafx.cppは入っていますか?
もちろん入れてます。

未だに解決しません・・・。
cpp/hの移動をしていないプロジェクトだと、debug/releaseフォルダを削除
しても、リビルドかければ再度作ってくれるのにも関わらず、
今回の私の手法だと、消してしまうと上記のエラーと、
「pchのビルドの方法がわかりません。」等ともエラーが出ます。
つまり*.pchの作成が出来ないって事なんでしょうけれども、

これも
プロジェクト(P)→設定(S)→C/C++タブ→プリコンパイル済ヘッダの
「作成」を指定して、stdafx.hを指定しているのですが、
実行すると、*****.cppとxxxxxx.cppが*.pchファイルを作成しようとしています。
とエラーが出てしまいます。

現在はムカつきながらも作業続けてて、暇が出来たらコピーとって色々やってますが
解決に至りません。orz

REE 2005/07/27(水) 20:40:06
>プロジェクト(P)→設定(S)→C/C++タブ→プリコンパイル済ヘッダの
>「作成」を指定して、stdafx.hを指定しているのですが、

ここで、inc/stdafx.h 又は inc\stdafx.h を指定してみるとか?

める 2005/07/27(水) 20:50:20
ちなみに今、全くの新規のプロジェクト(ダイアログベースです。)を作成し、
同じ事をやってみましたが、駄目でした。

1.新規プロジェクトを作成。(ダイアログベース選択→終了)
2.ワークスペースから全てのソース・ヘッダをdelキーにて削除。
3.エクスプローラで、プロジェクトのフォルダにsrc/incフォルダ作成。
4.3.のフォルダに*.cpp/*.hをコピー。
5.ワークスペースへファイル追加。
6.ビルド・・・エラー三昧。

さらにあんまり意味はありませんが、一度VC閉じてから、
*.clwファイルを削除して、再度VC立ち上げてclasswizard開くと
*.clwが無いから、ソースから作るか?的なメッセージが出るので、

src/incフォルダを指定して「全て追加」でclasswizard作り直しましたが、
それでも駄目でした。

また、システム関係のstdafx.cpp/stdafx.h/resource.hの3つを
src/incフォルダから取り出して、*.dswと同じ場所に置いても変わりません。
何かシステムで固定でフォルダしてされてたりするんでしょうか?

どなたか、ソース・ヘッダを別のフォルダで管理してる方ってどうしてるの
でしょうか?

PATIO 2005/07/28(木) 10:15:21
私が関わったプロジェクトで以下のような構成でビルドを行っていましたが
特に問題は起こっていません。

projecthome + AAAA <-ここにstdafx.h,stdafx.cppとAAAA.dsw,AAAA.dsp,AAAA.clw,etc...
            |
            + Include <-ここに上記以外のインクルードファイル一式
            |
            + Source + General <-ここに汎用関数のソース
            |        |
            |        + FileAccess <-ここにファイルアクセス系のソース
            :        :
            :        :
            + Lib <- ここに作成したライブラリファイル(リリース用)

ちなみにAAAAの下にReleaseとDebugがあってそこにobjファイルとlib、dll等があります。
まあ、このフォルダは作業用ですね。
この構成はいろいろ考えた挙句、こうすればうまく行くということでそうしたと思います。
その後、VC++のファイル構成はあまりいじるのは良くなさそうだという結論になりまして
空のワークスペースフォルダをこさえてそれにプロジェクトを追加するような形にして
います。その上でIDEのFileViewの上だけでフォルダ分けを行い、実際のファイルはプロ
ジェクトフォルダの下にそのままおいています。
開発中はほとんどIDEからファイルを扱う事になるので不自由はしてません。
プロジェクトフォルダの配下を標準の構成から変えるとプロジェクトの設定等で調整が
必要になるのであまり好ましくないみたいです。

める 2005/07/28(木) 14:11:08
PATIOさん

この例だと、projecthome以下は全てフォルダで分けられていて、
単品のファイルは無いって事ですよね。
一体何が悪いんでしょう。
こんなに使われてて枯れたツールなんですけどね・・・

スレ的にも、解決してないですが解決しておくべきなのか、
回答仰いでいいものか悩みます。

今日いっぱいは残させてください。
宜しくお願い致します。

どとう 2005/07/28(木) 14:35:57
以下のような設定になってますか?

StdAfx.cppのみ、「プリコンパイル済ヘッダの作成」を指定
その他のソースは、「プリコンパイル済ヘッダの使用」を指定
(共にこのヘッダまでは、stdafx.hを指定)

後から、StdAfx.cppを追加すると、デフォルトで
「プリコンパイル済ヘッダの使用」になってしまいます。

外していたら、ごめんなさい。

める 2005/07/28(木) 23:56:13
[[解決]]
◎どとうさん
回答ありがとうございます。全然外してなんていません。
うまくいきました!!

>後から、StdAfx.cppを追加すると、デフォルトで
>「プリコンパイル済ヘッダの使用」になってしまいます。

知りませんでした・・・。そもそも恥ずかしながら「設定」にある
「設定の対象(S)」の下のツリー表示で、この問題の項目を
「ファイル毎に設定出来る」事を知りませんでしたorz。
いつも最上位のプロジェクト名を選んで設定してたものですから。

確かにStdAfx.cppは一旦プロジェクトから外して追加し直している為、
ご指摘の様に「プリコンパイル済ヘッダの使用」になっていました。

最初、指摘個所を修正すると、なぜかdebug版のみビルドのみOKで
release版は「A.cppとB.cppの両方で*.pch作ろうとしてっからダメよ。」の
エラーが出てしまい、release版を確認したら、何故か全部「pchの作成」に
なっていました。これもきっちり設定しなおしたら問題ありませんでした。

長々とスレを上位に置いといてしまって、ご迷惑おかけ致しました。
皆さんにはいつも助けて頂いてばっかりで感謝の気持ちでいっぱいです。
ありがとうございました。m(__)m

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