【问题标题】:Why doesn't cl.exe generate any output when I call it from Perl?当我从 Perl 调用 cl.exe 时,为什么不生成任何输出?
【发布时间】:2010-01-07 19:47:34
【问题描述】:

我在运行 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 输出到文件然后移动文件(文件为空白),取消设置 VS_UNICODE_OUTPUT 环境变量(无效)。没有改变行为 - 手动运行命令行时会生成输出,但在此项目的预构建事件中运行时不会生成输出。

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

【问题讨论】:

  • 我看到您解决了问题,但我很惊讶,因为您似乎在路径中缺少双反斜杠 - 或者这只是一个 SO 格式化伪影?
  • 我有一个类似的问题。在我的情况下,Perl 脚本在 powershell 中运行良好,但作为构建事件,它不会输出相同的文本。它“似乎”正在工作,但输出不同(马车控制和其他问题表明奇怪的环境差异),我担心我可能会遇到问题。整个问题/答案令人深思。

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


【解决方案1】:

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

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

【讨论】:

  • 嗯,谢谢!我忘了提到此时我已禁用 UAC 并将 devenv.exe、cl.exe 和 perl.exe 全部设置为以管理员身份运行(这是来自具有管理员权限的帐户)。但我会看看我是否可以在 ACL 上搞点事情并获得更多信息。
  • 嗯,我为我的用户审核了有问题的输出文件的失败和成功(实际上是输出目录中的所有文件,因为我正在删除然后重新创建文件并且审核设置为迷路)。我看到很多对象访问的审计成功,但没有失败。不过,我以前从未玩过审计,所以我可能做错了什么......:-/
  • 我总是将其设置为审核所有文件/目录,因为您永远不知道文件的创建位置(可能是随机的 tmp 位置。)
【解决方案2】:

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

感谢大家的关注。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • cl.exe 的退出代码是成功的,perl 脚本也是如此。我已经通过 perl println 和 echo ... 打印了命令行,并验证了 @args 是否正确传递。 err.txt 也总是空的。感谢您的建议!我现在已经在这方面进行了几天的黑客攻击。 :-)
    猜你喜欢
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    相关资源
    最近更新 更多