4

次のようなコンパイル エラー (赤い下線) が発生するという問題があります。

Error: cannot open source file "stdafx.h"

環境の編集されたスクリーンショットを次に示します。

コンパイルエラーでビルド可能

左側は、[すべてのファイルを表示] がオフになっている Visual Studio ソリューション ディレクトリ リストです。

私は学校のプロジェクトに取り組んでおり、各フォルダーはプロジェクトのさまざまな部分のソース ファイルであり、さまざまな担当者がいます。

たとえば、生徒 A と B は AST フォルダーと PARSER フォルダーを担当しています (これらをサブプロジェクトと呼びます)。サブプロジェクトごとに API があるため、他のサブプロジェクトは何を呼び出せばよいかがわかります。

TOP-CENTER には、クラスのソース ファイルがありQueryProcessorます。(最初の数行だけ) その下には、 の出力がありBuild Successます。

赤い線はすべてのクラスにあり、主#include "stdafx.h"に環境によって開くことができないことが原因です。

右側ではstdafx.h、すべての異なるサブプロジェクトを含める場所であるため、各プロジェクトが異なる stdafx.h を持つという問題を回避できます。

ただし、プロジェクトをビルドすることはできます。このディレクトリ/リンクを間違って行っていると確信しています。

4

3 に答える 3

1

これはうまくいくはずです

  1. ソリューション ファイルを右クリックします。
  2. Windows エクスプローラーで [開く] をクリックします。
  3. エクスプローラーでファイル stdfx.h を見つけ、フォルダーのパスをコピーします。
  4. Visual Studio ソリューション エクスプローラーで、プロジェクト ファイルを右クリックします。
  5. [プロパティ] -> [C/C++] -> [全般] をクリックします
  6. 追加のインクルード ディレクトリにパスを貼り付けます
于 2012-10-22T11:13:31.153 に答える
1

stdafx.hこれは基本的にコンパイル時の最適化であり、コンパイラがすべてのコンパイル単位でこれらのヘッダーを継続的にコンパイルしないようにします。

これらのヘッダーのいずれかが変更された場合は、システム全体を再構築する必要があります。

実際には、変更する予定のない標準のヘッダーとサードパーティのヘッダー (boost ライブラリなど) を含めるためにのみ使用することをお勧めします。

独自のライブラリのいくつかは「確定」しており、含めることもできると判断する場合があります。

すべてのプロジェクト、つまり個別のユニット (DLL または .exe) に組み込まれるプロジェクトのすべての部分には、独自のプリコンパイル済みヘッダーと独自のバージョンの stdafx.h が必要です。

プロジェクトには、他のプロジェクトのものではなく、独自の .stdafx のみを含める必要があります。したがって、このヘッダー ファイルを使用して、dllexport マクロを定義することもできます。

プロジェクト ヘッダーを配置するときは、次の点に注意する必要があります。

後者の並べ替えには stdafx.h ファイルを含める必要があり、理想的には、プロジェクトの外部からインクルードされたヘッダーと同じディレクトリに配置しないでください。

于 2012-10-22T11:29:06.550 に答える
1
  1. 仮想フォルダーはすべてのファイルが 1 つのディレクトリにあることを示し、ハードドライブ上に作成されたフォルダーは明らかにすべてのファイルが異なるディレクトリにあることを示すため、VC でフォルダーと仮想フォルダーを組み合わせるのは面倒です。何が起こっているのかわかっている場合は組み合わせることができますが、あなたの場合はお勧めしません。

  2. stdafx.h の目的を誤解していると思いますが、このヘッダー ファイルの目的は、すべてのヘッダー フィルをそのファイルに入れ、それを他のすべてのファイルにインクルードすることではありません。stdafx.h のこの目的に関する SO の質問は次のとおりです。

  3. stdafx.h ファイルをクリーンアップした後、できるだけ多くのヘッダー ファイルを .cpp ファイルにインクルードし、ヘッダー ファイルで必要な場合にのみ、これらのインクルードをヘッダー ファイルに入れます。

  4. [すべてのファイルを表示] をオンにすると、実際のフォルダーを操作できるようになります。「PKB」などのフォルダーをアドレス指定すると、左側のソリューション エクスプローラーで確認できるため、このフォルダーが実際に存在することを確認できます。

  5. 名前空間 std; を使用する場合。たとえば、必要なヘッダー ファイルも含めるようにしてください。「このヘッダー ファイルに含まれている別のヘッダー ファイルに iostream などを既に含めているので、必要ない」と思うかもしれません。これは、より大きなプロジェクトで作業するときに本当にあなたを破壊します。

ああ、stdafx.h インクルードの問題に関しては、すべてのファイルを表示するように切り替えるとすぐに、stdafx がインクルードを使用するファイルとは別のファイルにあることに気付くと思います。多分何か#include "..\stdafx.h"が必要です(あなたの構造に依存します)。

明らかだと思いますが、ヘッダーファイルをインクルードする場合、インクルードは他のヘッダーファイルをインクルードしているファイルに対して常に相対的です。

于 2012-10-22T11:15:47.830 に答える