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.
我正在尝试使用 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.