早上好, 我正在尝试使用VS2008编译器(msbuild)使用Ant编译C ++项目。 这是我的操作顺序:
<target name="setEnv" >
<exec dir="." executable="cmd">
<arg line="/c setEnv.bat" />
</exec>
</target>
其中setEnv.bat将环境变量设置为使用msbuild
@echo off
REM Load Visual Studio's build tools
call "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" x64
并在执行此
之后 <target name="msbuildSln" depends="setEnv">
<exec executable="msbuild">
<arg value="${myproj.sln}" />
<arg value="/p:Configuration=Release" />
<arg value="/p:Platform=x64" />
</exec>
</target>
问题是,当我从目标msbuildSln调用msbuild时,环境变量实际上没有设置我有这样的消息:
BUILD FAILED
C:\Users\workspace\MyProj\mybuild.xml:82: Execute failed: java.io.IOException: Cannot run program "msbuild": CreateProcess error=2, The system cannot find the file specified
我认为这是cmd范围的问题,因为如果我在setEnv.bat中启动它,它就会运行。
我尝试了不同的解决方案:
1)直接从其文件夹中调用msbuild并运行我的目标
2)设置环境。全局vcvarsall.bat的变量
3)对我的Ant脚本进行双重调用,修改mt setEnv.bat:
call "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" x64 %*
ant -f mybuild.xml msbuildSln
设置类似于default =“setEnv”并从msbuildSln目标中的setEnv中删除dependece。
我正在采用最后的解决方案,但我不知道它是否会影响性能。但最重要的一点是有一种方法来设置和使用vcvarsall.bat和msbuild在一起,因为我必须做很多步骤(比如从svn结账,构建解决方案等......)而我想用Ant做完而不是全部在.bat文件中。 感谢。
答案 0 :(得分:2)
执行第一个cmd
:
ant
进程)。 即使您的setEnv.bat
使用 setx
命令永久设置环境变量,它也不可用于以下ant语句/目标,因为当前环境(ant
进程)在重新启动并再次生成系统之前不会有新的环境变量。
我刚注意到您的setEnv.bat
只是调用另一批...为什么不直接调用该批次?
您需要在同一个shell中调用setEnv.bat
和msbuild
,即cmd
声明:
<exec dir="." executable="cmd">
<arg line="/c setEnv.bat & msbuild ${myproj.sln} /p:Configuration=Release /p:Platform=x64" />
</exec>
注意编写命令行所需的&
&
可读性的替代语法:
<exec dir="." executable="cmd">
<arg value="/c" />
<arg value="setEnv.bat" />
<arg value="&" />
<arg value="msbuild" />
<arg value="${myproj.sln}" />
<arg value="/p:Configuration=Release" />
<arg value="/p:Platform=x64" />
</exec>