Visual Studio でテスト プロジェクト (CxxTest) をビルドし、ビルド後のイベントを介してすぐに実行します。これは機能し、すでに長い間機能しています。コマンドラインシェルから手動で実行する場合と比較して、ビルド後のイベントでの実行では動作が異なります。次のコードは、手動または Visual Studio デバッガーを使用して exe を起動する場合と比較して、ビルド後のイベントでの動作が異なります。
// getValueFromStruct returns empty string when executed
// as post build event, but returns correct value when executed manually
std::string expectedValue1("Val_1");
TS_ASSERT_EQUALS(expectedValue1, getValueFromStruct(res1));
これは、次のヘルパー関数です。
std::string getValueFromStruct(tResult pResult)
{
std::string result = "";
if (pResult.pCharDetails != NULL)
{
for (int i=0; i < pResult.iNumResults; i++)
{
result.append(1, static_cast<char>(pResult.pCharDetails[i].wChar1));
}
}
// also the cout of the result is empty when executed from
// build event, but is filled with data when in shell
std::cout << ++callCount << " : " << result<< std::endl;
return result;
}
同じメソッドで tResult の複数のインスタンスに対して getValueFromStruct(tResult) が呼び出された場合にのみ問題が発生するようです。
2つの方法の間に、環境、ランタイムライブラリ、または何か他のものの間に違いはありますか? Visual Studio はビルド イベントのコマンド ライン環境を操作していますか?
この問題は、リリースおよび x64 モードでのみ発生します。そして、ビルドサーバーではなく、私のマシンでのみ発生します。しかし、サーバーのようにビルドスクリプトを介して自分のマシンにビルドしたときにも発生します。
この問題を回避する 3 つの方法を見つけました。
- 関数の結果を引数として直接渡すのではなく、一時変数を使用します。
- test.exe の最適化を無効にする
- test.exe の「インライン関数展開」を「無効 /Ob0」に設定します。
ただし、ビルド イベントと通常のコマンド ラインで動作が異なる理由は説明されていません。