MSYS2 区分大小写并包含在 XP 上?

MSYS2 case sensitivity and includes on XP?

我正在尝试使用 MSYS2 (msys2-base-i686-20160205.tar.xz) 在 XP 上编译一个项目。包含的文件之一如下:

/z/path/to/libA/Include/A/B/String.h

反过来,该文件在其第 34 行中执行:

#include <string.h>

此文件已经存在,比如:

Z:/msys32/mingw32/i686-w64-mingw32/include/string.h

... Z: 驱动器也是我的代码所在的位置。在我的 g++ 编译行中,我首先有 -I Z:/msys32/mingw32/i686-w64-mingw32/include,然后在大量包含之后,-I /z/path/to/libA/Include/A/B。但是,当我尝试编译时,编译失败,与String.h有关。

所以,我通过添加 -v -E(到 "stop after the preprocessing stage")并在 g++ 命令行更改为 -o File.e 进行了一些检查,并且可以在结果 File.e:

...
# 34 "Z:/path/to/libA/Include/A/B/String.h" 2
# 1 "Z:/path/to/libA/Include/A/B/string.h" 1
# 35 "Z:/path/to/libA/Include/A/B/String.h" 2
...

据我了解,预处理器来到 Z:/path/to/libA/Include/A/B/String.h 的第 34 行,看到 #include <string.h>,开始在当前目录中寻找 string.h - 并找到它,即使它不存在于这样的名字下!?事实上,如果我从 MSYS2 bash shell:

$ find Z:/path/to/libA/Include/A/B/ -name 'string.h'

... 不返回任何内容(发现 String.h,大写);但是,如果我强制使用非大写或大写名称的列表:

$ ls -la Z:/path/to/libA/Include/A/B/String.h
-rw-r--r-- 1 User None 2885 May 31 09:45 Z:/path/to/libA/Include/A/B/String.h

$ ls -la Z:/path/to/libA/Include/A/B/string.h
-rw-r--r-- 1 User None 2885 May 31 09:45 Z:/path/to/libA/Include/A/B/string.h

...然后它们都被报告为存在?!

我猜这就是 "confuses" g++,因为它被阻止寻找 string.h(小字母)elsewhere/in 系统路径.从那以后,我找到了 Git-windows case sensitive file names not handled properly 和:

While NTFS (and some remote filesystems) support case-sensitivity, the NT kernel starting with Windows XP does not support it by default. Rather, you have to tweak a registry setting and reboot. For that reason, case-sensitivity can not be supported by Cygwin, unless you change that registry value.
If you really want case-sensitivity in Cygwin, you can switch it on by setting the registry value
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\kernel\obcaseinsensitive
to 0 and reboot the machine.

...我这样做了,但我仍然遇到同样的问题;不确定这是否是因为我在 MSYS2(不是 Cygwin)上使用 MINGW;或者因为像 Enable case sensitive behavior with Windows XP and Interix Subsystem or SFU 这样的资源引用了 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Kernel\ObCaseInsensitive (注意,大写);但是,我已经有了这些键(我只是将其设置为 0,然后重新启动),并且它们带有微小的字母,例如 cygwin.com link。另外,重启后测试,这也没有帮助。

虽然 How can I make MinGW case-sensitive for included header file names 表明这可能无法解决 - 我能做些什么来解决这个问题,并说服 g++ 从系统中读取 string.h地点?我已经尝试在不同的机器上构建相同的库,Windows 7 或 8 远程桌面,使用相同的 MingW 版本 - 所以应该可以做一些事情......

-I Z:/msys32/mingw32/i686-w64-mingw32/include 添加到命令行的开头不起作用,因为该目录已经在 GCC 的系统包含目录列表中。我不确定为什么,但这是 GCC 记录的行为。

最好的解决方案是重命名该库中的 header 文件,并重命名所有尝试使用它的包含。或者,使用 -I /z/path/to/libA/Include/#include <A/B/String.h>#include 指令中的文件夹名称将确保包含库 header 而不是系统 header.