C++ 在lanching vcvvarsall.bat之后从ant执行msbuild

C++ 在lanching vcvvarsall.bat之后从ant执行msbuild,c++,batch-file,visual-studio-2008,ant,msbuild,C++,Batch File,Visual Studio 2008,Ant,Msbuild,早上好, 我试图用VS2008编译器(MSBug)编译一个带有Ant的C++项目。 这是我的操作顺序: 其中setEnv.bat将环境变量设置为使用msbuild @echo关闭 REM加载Visual Studio的构建工具 调用“C:\ProgramFiles(x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat”x64 在它执行这个之后 问题在于,当我从目标msbuildSln调用msbuild时,环境变量未设置,事实上,我收到以下消息

早上好, 我试图用VS2008编译器(MSBug)编译一个带有Ant的C++项目。 这是我的操作顺序:


其中setEnv.bat将环境变量设置为使用msbuild

@echo关闭
REM加载Visual Studio的构建工具
调用“C:\ProgramFiles(x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat”x64

在它执行这个之后


问题在于,当我从目标msbuildSln调用msbuild时,环境变量未设置,事实上,我收到以下消息:

生成失败
C:\Users\workspace\MyProj\mybuild.xml:82:执行失败:java.io.IOException:无法运行程序“msbuild”:CreateProcess error=2,系统找不到指定的文件

我认为这是cmd作用域的问题,因为如果我在setEnv.bat中启动它,它就会运行。 我尝试了不同的解决方案:
1) 直接从其文件夹调用msbuild并运行我的目标
2) 设置环境。vcvarsall.bat的全局变量
3) 对修改mt setEnv.bat的Ant脚本执行双重调用:
调用“C:\ProgramFiles(x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat”x64%*
ant-f mybuild.xml msbuildSln
设置类似于project default=“setEnv”并从msbuildSln目标中的setEnv中删除依赖项

我正在采用最后一种解决方案,但我不知道它是否会影响性能。但最重要的一点是,有一种方法可以同时设置和使用vcvarsall.bat和msbuild,因为我必须执行许多步骤(如从svn签出、构建解决方案等),并且我希望使用Ant来完成,而不是将所有内容都放在.bat文件中。
谢谢。

当您执行第一个
cmd
命令时:

  • 它产生一个新的shell(继承当前shell的当前环境,即
    ant
    进程)
  • 该命令完成后,shell将被销毁,它可能创建的任何非持久性更改(例如设置变量)都将丢失
即使您的
setEnv.bat
使用命令永久设置环境变量,它也不会对以下ant语句/目标可用,因为当前环境(ant进程)在重新启动并再次从系统中派生之前不会有新的环境变量

我刚刚注意到你的
setEnv.bat
只是调用了另一批。。。为什么不直接调用该批

您需要在同一个shell中调用
setEnv.bat
msbuild
,即
cmd
语句:

<exec dir="." executable="cmd">
    <arg line="/c setEnv.bat &amp; msbuild ${myproj.sln} /p:Configuration=Release /p:Platform=x64" />
</exec>

从visual studio命令窗口中启动Ant,即您已经调用vcvarsall.bat的窗口?@stijin已经尝试从.bat使用cl.exe进行设置,但我得到了相同的结果;它设置了变量,但当我回到ant时,我不能使用它们。我也尝试过在这样的:
中执行所有程序,但我无法从标记中执行其他类似msbuild的程序。我想我需要一些结构来做一个蚂蚁中不存在的嵌套。太好了,你救了我。非常感谢你!!
<exec dir="." executable="cmd">
    <arg value="/c" />
    <arg value="setEnv.bat" />
    <arg value="&amp;" />
    <arg value="msbuild" />
    <arg value="${myproj.sln}" />
    <arg value="/p:Configuration=Release" />
    <arg value="/p:Platform=x64" />
</exec>