Windows RC.exe 和长路径

问题描述

我正在使用 waf 2 在 windows 上构建一个可执行文件。构建包含多个资源文件。我正在使用我知道的最新 Windows sdk(版本 10.0.19041.0)。我遇到了 2 个独立但相关的问题。两者似乎都与 windows 资源编译器和长路径有关。

首先,如果包含路径之一包含空格,则所有包含路径参数必须在命令行上,或者所有包含路径必须包含在 INCLUDE 环境变量中。如果我尝试在 INCLUDE 环境变量中列出长路径并将其余的包含路径保留在命令行上,那么我会从 rc.exe 收到以下错误

致命错误 RC1107:无效使用

如果我将所有包含路径放在 INCLUDE 环境变量中,或者我在命令行上列出所有包含路径,则不会发生此错误

如果我让 waf 将所有命令行参数放在响应文件 rc.exe 中,则会出现与上述相同的错误

致命错误 RC1107:无效使用

为了将所有包含路径添加到响应文件中,我必须使用 Windows 短路径名。

因此,如果我有任何长路径的包含路径,我必须强制 waf 不使用响应文件,或者我需要将所有包含路径放在 INCLUDE 环境变量中。

我真的很想将所有命令行参数(包括长路径)放在响应文件中,或者我想将长路径放入 INCLUDE 环境变量中并让 waf 处理参数自动

如果有的话,我该怎么做才能让 rc.exe 处理响应文件中的长路径? 如果有的话,我该怎么做才能让 rc.exe 处理环境变量中的长路径和响应文件上的其他路径?

请注意,我已尝试将长路径放入引号中。我也试过逃避长路径中的空间。两个都不行。

解决方法

我在使用 cmake 编译资源时遇到了类似的问题。 CMake 确实将所有包含放入 VS 项目 Resources->General->Additional Include Directories 属性。

然后我在构建的 BuildLog.htm 中看到以下内容:

Creating temporary file "RSP1.rsp" with contents
[
 /d "NDEBUG" /d "CMAKE_INTDIR=\"Release\"" /I "D:\SharedwLnx\DebuggedCode\cmakeResources\hello\cmake" /I "D:\SharedwLnx\DebuggedCode\cmakeResources\hello\aaaaaaaa" /I "D:\SharedwLnx\DebuggedCode\cmakeResources\hello\aaaaaaab" /I "D:\SharedwLnx\DebuggedCode\cmakeResources\hello\aaaaaaac" /I "D:\SharedwLnx\DebuggedCode\cmakeResources\hello\aaaaaaad" /I "D:\SharedwLnx\DebuggedCode\cmakeResources\hello\aaaaaaae" /I "D:\SharedwLnx\DebuggedCode\cmakeResources\hello\aaaaaaaf" /I "D:\SharedwLnx\DebuggedCode\cmakeResources\hello\aaaaaaag" /I "D:\SharedwLnx\DebuggedCode\cmakeResources\hello\aaaaaaah" /I "D:\SharedwLnx\DebuggedCode\cmakeResources\hello\aaaaaaai" /I "D:\SharedwLnx\DebuggedCode\cmakeResources\hello\aaaaaaaj" /I "D:\SharedwLnx\DebuggedCode\cmakeResources\hello\aaaaaaak" /I "D:\SharedwLnx\DebuggedCode\cmakeResources\hello\aaaaaaal" /I "D:\SharedwLnx\DebuggedCode\cmakeResources\hello\aaaaaaam" /I "D:\SharedwLnx\DebuggedCode\cmakeResources\hello\aaaaaaan" /I "D:\SharedwLnx\DebuggedCode\cmakeResources\hello\aaaaaaao" /I "D:\SharedwLnx\DebuggedCode\cmakeResources\hello\aaaaaaap" /fo "hello.dir\Release/description.res" "D:\SharedwLnx\DebuggedCode\cmakeResources\hello\description.rc"
]
Creating command line "Rc @"D:\SharedwLnx\DebuggedCode\cmakeResources\hello\_build_vs19\hello.dir\Release\RSP1.rsp""

Microsoft (R) Windows (R) Resource Compiler Version 10.0.10011.16384
Copyright (C) Microsoft Corporation.  All rights reserved.

fatal error RC1109: error creating "hello.dir\Release/description.res"

如果我使用上面的选项在命令行上运行 Rc,它工作得很好。

如果我减少包含的数量,它也可以正常工作。尽管 BuildLog.htm 中的相关部分是:

Compiling resources...
Rc /d "NDEBUG" /d "CMAKE_INTDIR=\"Release\"" /I "D:\SharedwLnx\DebuggedCode\cmakeResources\hello\cmake" /fo "hello.dir\Release/description.res" "D:\SharedwLnx\DebuggedCode\cmakeResources\hello\description.rc"
Microsoft (R) Windows (R) Resource Compiler Version 10.0.10011.16384
Copyright (C) Microsoft Corporation.  All rights reserved.

VS 从直接运行 Rc 命令切换到生成 RSP1.rsp 并在命令行很长时运行 Rc @"RSP1.rsp"。这会破坏资源编译。

我对自己编写的 .rsp 文件做了一些实验。看起来如果它在 .rc 文件名和包含目录周围包含撇号,Rc @"RSP1.rsp" 将失败,尽管我不知道 VS 生成的文件的内容。

在我看来,这看起来像是负责该 .rsp 文件的 Visual Studio 组件中的错误或 Rc 中的错误。因此,我将更改为自定义生成 .res 文件并将其链接到我的可执行文件。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...