5

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

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

根据编译器选项,响应文件(@选项):

响应文件可以包含您在命令行中指定的任何命令。如果您的命令行参数超过 127 个字符,这将很有用。

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

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

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

4

2 回答 2

4

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

于 2018-11-02T10:43:15.963 回答
2

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

PROJNAME=hello

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

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

在该 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 文档(尽管文档非常稀少 - 他们可以使用一两个示例)。


更新:

如果你真的想要或需要捕获 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;
}
于 2014-05-04T03:02:30.883 回答