当我从Perl调用它时,为什么cl.exe不生成任何输出?

时间:2010-01-07 19:47:35

标签: visual-studio visual-studio-2008 io-redirection cl.exe bootcamp

我遇到一个奇怪的问题,运行cl.exe让我难倒。在由C / C ++项目组成的大型VS2008解决方案中,我有一个项目运行一些脚本来进行一些额外的处理。该项目包含一个预构建事件,该事件调用Perl脚本(ActiveState Perl在机器上)。然后,此Perl脚本使用/E调用cl.exe以生成预处理的输出,该输出将重定向到文件。 Perl中的这一行看起来像这样:

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

args.rsp 是一个纯文本文件,其中包含一堆cl.exe命令行参数,包括/E以获取stdout上的预处理器输出。

从VS2008命令提示符运行时,此命令行正常工作。在我的Windows XP机器上构建项目也可以正常工作。但是,在我的新Windows 7框中,当我构建项目时, out.txt 结束为空。我还应该在我的一些同事的Windows 7机箱上添加它,它可以正常工作,而在其他一些机箱上则没有。

显然存在某种配置差异,但我不知道它可能是什么。我们检查了VS2008 SP1和ActiveState Perl的匹配版本。我在perl脚本中尝试了无数的变通方法 - 使用system()而不是反引号,使用cl.exe /P输出到文件然后移动文件(文件为空),取消设置{{1}环境变量(无效)。没有任何改变行为 - 手动运行命令行时会生成输出,但是当它在此项目的预生成事件中运行时不会生成。

有关哪种配置问题可能导致此问题的任何想法?我几乎没有办法去追求。

3 个答案:

答案 0 :(得分:2)

对我来说听起来像ACL问题。您可以更改窗口以记录访问问题,然后检查事件日志以查看哪些用户获得访问被拒绝错误。

我认为该设置在本地政策中审计政策|审核对象访问

答案 1 :(得分:1)

哇,对此的解决方案最终比我预期的要陌生。我正在研究的机器(以及其他同样遇到问题的同事)是一台安装了bootcamp和Windows 7的Mac Pro。这导致C:拥有Windows驱动器,E:拥有mac驱动器。这会导致问题,因为预构建事件有几行测试每个驱动器号以查看是否有驱动器,如果有,则将X:\ Perl \ bin添加到路径中。即使E:\ Perl \ bin不存在,它也会被添加到路径中。稍后,perl脚本运行然后调用cl.exe,由于某种原因,在mac驱动器中有一个目录会导致cl.exe失败。为什么?我不知道。无论如何,从路径中删除mac驱动器目录可以解决问题!

感谢大家的眼睛。

答案 2 :(得分:0)

查看程序的退出代码。您可能希望使用File::Spec等内容以便携方式构建可执行文件名。另外,检查@args是否未插值。您可能希望在执行之前打印命令行,以检查这是否是您想要的。您的err.txt文件还剩下什么?