3

カスタムオブジェクトリレーショナルマッピングシステムを使用するC++プロジェクトがあります。このシステムでは、テーブルは.tblファイルによって定義されます。次に、これらは、それぞれに対して.hファイルと.cppファイルを作成するコードジェネレーターを介して実行されます。

Visual Studio 2008および2010で、このためにカスタムビルドルールを機能させようとしています。

これは私が今のところ持っているものです:

<?xml version="1.0" encoding="utf-8"?>
<VisualStudioToolFile
    Name="z_dbbld"
    Version="8.00"
    >
    <Rules>
        <CustomBuildRule
            Name="z_dbbld"
            DisplayName="z_dbbld"
            CommandLine="$(SolutionDir)\tools\z_dbbld $(InputName)"
            Outputs="$(InputName).cpp"
            FileExtensions="*.tbl"
            ExecutionDescription="z_dbbld  $(InputName)"
            >
            <Properties>
            </Properties>
        </CustomBuildRule>
    </Rules>
</VisualStudioToolFile>

問題は依存関係です。クリーンチェックアウトでビルドを実行すると、ファイルが存在しないため、このルールによって生成された.hファイルに対して「インクルードファイルを開くことができません」というエラーが発生します。

出力を「$(InputName).h」に変更しようとしましたが、それでもエラーが発生します。

これで、コードジェネレーターの実行時にこれらのファイルが作成されます。すべてのファイルが最初のパスで作成されたため、再度コンパイルしてもエラーは発生しません。ただし、クリーンで自動化された、フレッシュチェックアウトからのビルドは機能しません。

何か案は?

4

2 に答える 2

0

ビルドの主要部分で出力ファイルを指定する必要があると思います(http://msdn.microsoft.com/en-us/library/hefydhhy.aspxの最後の文を見てください)。おそらく最も簡単な方法は、ファイルが存在する場合にファイルへの参照を追加してから削除し、codegen ステップが正常に実行されるかどうかを確認することです。

于 2011-10-21T07:25:39.513 に答える
0

sblom の回答は正しいですが、理由は説明されていません。

ビルド ルール (カスタムまたはネイティブ) ごとに、VS ビルド システムは、プロジェクトのどの部分をビルドする必要があるかを判断できるように、入力と出力の完全なリストを知る必要があります。

ビルド ルールは、生成された .cpp ファイルを出力として宣言するため、VS はそれを認識し、このファイルを自動的にビルドします。ヘッダー ファイルを省略したため、VS はそれを認識していないため、このヘッダーを含むソース ファイルはどこから取得すればよいかわからず、ビルドに失敗します。この状況でビルドを機能させるための回避策は、この .h ファイルが配置されているディレクトリをインクルード パスに追加することです。これにより、このファイルの #includes が機能します。基本的に、VSがこのファイルについて別の方法で認識できるようにしています。

逆に、ヘッダー ファイルを出力として宣言するようにビルド ルールを変更すると、ヘッダー ファイルを含むソース ファイルはこのファイルの取得元を認識しますが、VS は .cpp ファイルを認識しないため、ビルドされません。この場合の回避策は、生成された .cpp ファイルをソース ファイルとしてプロジェクトに明示的に追加することです。上記の場合と同様に、ビルド システムに生成されたファイルを認識させるトリックを使用しています。

ただし、上記の回避策で問題は解決しますが、VS がファイルを認識していないことを補うだけなので、最善の解決策ではありません。この問題に対処する最善の方法は、.cpp ファイルと .h ファイルの両方をルールで出力として宣言し、セミコロンで区切ることです。これにより、VS は両方のファイルに正しい動作を適用できます。

于 2011-10-23T18:08:16.940 に答える