3

cl.exe の実行で奇妙な問題が発生し、困惑しています。C/C++ プロジェクトで構成される大規模な VS2008 ソリューションでは、いくつかのスクリプトを実行して追加の処理を行う 1 つのプロジェクトがあります。プロジェクトは、Perl スクリプトを呼び出すプレビルド イベントで構成されます (ActiveState Perl はマシン上にあります)。次に、この Perl スクリプトは cl.exe を呼び出し/Eて、ファイルにリダイレクトされる前処理された出力を生成します。Perl の行は次のようになります。

my $foo = `"\path\to\cl.exe" @args.rsp >out.txt 2>err.txt`;

args.rspは、cl.exe の一連のコマンド ライン引数を含むプレーン テキスト ファイルであり、/Estdout でプリプロセッサ出力を取得するためのものです。

この正確なコマンド ラインは、VS2008 コマンド プロンプトから実行すると、期待どおりに機能します。プロジェクトのビルドは、私の Windows XP マシンでも問題なく動作します。しかし、私の新しい Windows 7 ボックスでは、プロジェクトをビルドすると、out.txtが空白になります。また、同僚の Windows 7 ボックスの一部では正常に動作し、他の一部では動作しないことも付け加えておく必要があります。

明らかに、何らかの構成の違いが発生していますが、それが何であるかについては途方に暮れています。VS2008 SP1 と ActiveState Perl の一致するバージョンを確認しました。perlスクリプト内で無数の回避策を試しました-system()バッククォートの代わりに使用cl.exe /Pし、ファイルに出力してからファイルを移動し(ファイルは空白です)、VS_UNICODE_OUTPUT環境変数を設定解除します(効果はありません)。動作に変更はありません。コマンド ラインを手動で実行すると出力が生成されますが、このプロジェクトのビルド前イベント内で実行すると生成されません。

これを引き起こしている可能性のある構成上の問題について何か考えはありますか? 私は追求する道がほとんどありません。

4

3 に答える 3

3

私にはACLの問題のように聞こえます。ウィンドウを変更してアクセスの問題をログに記録し、イベント ログをチェックして、アクセス拒否エラーが発生しているユーザーを確認できます。

設定はローカル ポリシー | にあると思います。監査ポリシー | オブジェクト アクセスの監査

于 2010-01-07T19:53:04.377 に答える
2

うわー、これに対する解決策は、私が予想していたよりもはるかに奇妙なものになってしまいました。私が作業しているマシン(およびこの問題が発生している他の同僚)は、bootcampとWindows7がインストールされたMacProです。これにより、C:にはWindowsドライブがあり、E:にはMacドライブがあります。ビルド前のイベントには、各ドライブ文字をテストしてそこにドライブがあるかどうかを確認し、ある場合はパスにX:\ Perl \ binを追加する数行があるため、これにより問題が発生します。E:\ Perl \ binは存在しませんが、パスに追加されます。その後、perlスクリプトが実行され、cl.exeが呼び出されます。何らかの理由で、Macドライブにディレクトリがあると、cl.exeが失敗します。なんで?何も思いつきません。とにかく、パスからmacドライブディレクトリを削除すると問題が解決します!

みなさん、ありがとうございました。

于 2010-01-07T22:11:18.397 に答える
1

プログラムの終了コードを確認してください。File::Specのようなものを使用して、移植可能な方法で実行可能ファイル名を作成したい場合があります。また、@args が補間されていないことを確認してください。実行する前にコマンドラインを印刷して、それが必要かどうかを確認することをお勧めします。あなたのファイルには何が残っていerr.txtますか?

于 2010-01-07T20:01:05.950 に答える