3

我在运行 cl.exe 时遇到了一个奇怪的问题,这让我很困惑。在一个由 C/C++ 项目组成的大型 VS2008 解决方案中,我有一个项目运行一些脚本来做一些额外的处理。该项目包含一个预构建事件,该事件调用一个 Perl 脚本(ActiveState Perl 在机器上)。这个 Perl 脚本然后调用 cl.exe/E以生成重定向到文件的预处理输出。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输出到文件然后移动文件(文件为空白),取消设置VS_UNICODE_OUTPUT环境变量(无效)。没有任何改变行为 - 手动运行命令行时会生成输出,但在此项目的预构建事件中运行时不会生成输出。

关于什么样的配置问题可能导致这种情况的任何想法?我几乎没有追求的途径。

4

3 回答 3

3

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

我相信设置在本地政策 | 审计政策 | 审计对象访问

于 2010-01-07T19:53:04.377 回答
2

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

谢谢大家的眼睛。

于 2010-01-07T22:11:18.397 回答
1

Check out the exit code of your program. You may want to build your executable name in a portable way using something like File::Spec. Also, check that @args is not interpolating. You may want to print your command line before executing to check if that's what you want. What is left your err.txt file?

于 2010-01-07T20:01:05.950 回答