我遇到一个奇怪的问题,运行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}环境变量(无效)。没有任何改变行为 - 手动运行命令行时会生成输出,但是当它在此项目的预生成事件中运行时不会生成。
有关哪种配置问题可能导致此问题的任何想法?我几乎没有办法去追求。
答案 0 :(得分:2)
对我来说听起来像ACL问题。您可以更改窗口以记录访问问题,然后检查事件日志以查看哪些用户获得访问被拒绝错误。
我认为该设置在本地政策中审计政策|审核对象访问
答案 1 :(得分:1)
感谢大家的眼睛。
答案 2 :(得分:0)
查看程序的退出代码。您可能希望使用File::Spec等内容以便携方式构建可执行文件名。另外,检查@args是否未插值。您可能希望在执行之前打印命令行,以检查这是否是您想要的。您的err.txt
文件还剩下什么?