与Visual Studio构建事件命令行和正常命令行有区别吗?

时间:2016-03-21 09:33:12

标签: c++ visual-studio visual-c++ cmd cxxtest

我使用Visual Studio构建测试项目(CxxTest)并立即通过构建后事件执行它。这已经有效了很长时间了。现在,与从命令行shell手动执行相比,我在构建后事件中的执行中有不同的行为。与手动或使用Visual Studio调试器启动exe相比,以下代码在post build事件中的行为有所不同:

// 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)时才会出现问题。

环境,运行时库或其他两种方式之间是否存在差异? Visual Studio是否为构建事件操作命令行环境?

问题出现在仅发布和x64模式。它只出现在我的机器上,而不是在构建服务器上。但是当它通过像服务器那样的构建脚本构建在我的机器上时也会出现。

我找到了三种绕过问题的方法:

  • 使用临时变量而不是传递结果 直接作为参数。
  • 禁用test.exe的优化
  • 设置&#34;内联函数扩展&#34;到&#34;禁用/ Ob0&#34; for test.exe。

但它没有解释为什么它在构建事件和常规命令行中表现不同。

0 个答案:

没有答案