【问题标题】:Capture Visual Studio response file?捕获 Visual Studio 响应文件?
【发布时间】:2014-06-20 12:18:26
【问题描述】:

我无法通过命令行使用nmake 将C++ 库移植到Windows Phone。 makefile 使用 Visual Studio 的 x86_arm 工具调用 cl.exelink.exe 并具有基本配方。

我使用 Visual Studio Phone 项目作为参考。在Process Monitor 下,我注意到Visual Studio 使用响应文件而不是直接驱动编译器。也就是说,Visual Studio 调用cl.exe <response file>

根据Compiler Options,响应文件(@ 选项):

响应文件可以包含您在 命令行。如果您的命令行参数超过 127 个字符。

这可能是我的端口问题,因为我的命令行超过 500 个字符(7 行以上,在控制台中换行)。

Visual Studio 使用写入AppData 文件的临时响应文件,该文件会立即被删除。我想检查 Visual Studio 的响应文件并尝试使用一个。

问题:如何捕获或检查 Visual Studio 响应文件?

【问题讨论】:

    标签: c++ visual-studio winapi command-line cl.exe


    【解决方案1】:

    您可以通过将环境变量MSBUILDPRESERVETOOLTEMPFILES 设置为1 来禁止删除.rsp 文件。

    【讨论】:

    • 这应该是标准答案
    【解决方案2】:

    我的 VS 项目似乎不使用响应文件(也许项目太小?),但是使用 nmake 的“内联文件”很容易让nmake 生成和使用响应文件。以下是一个简单的 makefile,它将使用 cl 命令行的响应文件来编译 hello.c

    PROJNAME=hello
    
    all:
        cl @<<
    -c $(PROJNAME).c
    -Ox
    <<
    

    基本上,将&lt;&lt; 放在要传递内联的命令上,然后在命令之后简单地放置文件内容并用另一个&lt;&lt; 标记作为分隔符结束内联文件。

    在该 makefile 上运行 nmake 会导致:

    C:\temp>nmake
    
    Microsoft (R) Program Maintenance Utility Version 10.00.30319.01
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
            cl @C:\Users\mikeb\AppData\Local\Temp\nmAC77.tmp
    Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
    cl -c hello.c
       -Ox
    
    hello.c
    

    可以看到内联文件中展开了nmake宏。

    有关更多详细信息,请参阅MSDN docs(尽管文档非常少 - 他们可以使用一两个示例)。


    更新:

    如果你真的想要或需要捕获 VS 正在使用的响应文件并且找不到其他方法来执行此操作,请编译以下程序并替换 VS 正在运行的程序,例如cl.exe,用它(显然将原始程序文件存储在某处,以便您可以反转操作):

    #include <stdio.h>
    
    void dump(char const* fname)
    {
        FILE* fp = NULL;
        char buf[1000];
        char* result = NULL;
    
        printf("Dumping response file \"%s\":\n\n", fname);
    
        fp = fopen(fname, "r");
    
        if (!fp) return;
    
        do {
            result = fgets(buf, sizeof(buf), fp);
            if (result) printf("%s", buf);
        } while (result);
    
        return;
    }
    
    
    int main(int argc, char** argv) 
    {
        int i;
        for (i = 1; i < argc; ++i) {
            char* fname;
            if (argv[i][0] != '@') {
                // not a response file
                continue;
            }
    
            fname = &(argv[i][1]);
    
            dump(fname);
        }
    
        return 0;
    }
    

    【讨论】:

    • 谢谢迈克尔。 Super User 上的一个人建议我从AppData\Temp 目录中删除DELETE 权限,这似乎更容易一些。 Visual Studio 抱怨,但它也允许我检查响应文件。现在,如果我只能找到有关格式的一些文档....
    • “我的 VS 项目似乎没有使用响应文件” - 查看各种日志文件时,它并没有出现(甚至我也没有出现)。但是,使用ProcMon 进行观察将显示它们在cl.exelink.exe 的命令行中都存在。
    • 顺便说一句,我终于找到了这些,但它们没有很好的文档记录(与内联文件一样):CL Command FilesLINK Command Files
    • 如果您使用的是nmake“内联”文件机制,请注意您可以在关闭
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 2012-09-25
    • 1970-01-01
    相关资源
    最近更新 更多