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

时间:2016-06-06 16:19:32

标签: c++ windows-xp case-sensitive include-path msys2

我正在尝试使用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(到&#34;在预处理阶段后退出&#34;)并在-o File.e命令行更改为g++来检查了一下,可以在生成的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并找到它,即使它没有& #39; t以这样的名字存在!?实际上,如果我从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

...那么他们都被报道为现有的?!

我猜这是&#34;混淆&#34; g++,因为它被阻止在系统路径的其他地方/寻找string.h(微不足道的字母)。因为,我找到了Git-windows case sensitive file names not handled properly和:

  

虽然NTFS(和一些远程文件系统)支持区分大小写,但从Windows XP开始的NT内核默认不支持它。相反,您必须调整注册表设置并重新启动。因此,除非您更改该注册表值,否则Cygwin不支持区分大小写   如果你真的想要在Cygwin中区分大小写,你可以通过设置注册表值来打开它   HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\kernel\obcaseinsensitive
  为0并重新启动机器。

......我这样做了,但我仍有同样的问题;不确定这是因为我在MSYS2上使用MINGW(不是Cygwin);或者因为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链接中一样。此外,重启后测试,这也没有帮助。

虽然How can I make MinGW case-sensitive for included header file names表示可能无法解决此问题 - 我是否可以采取任何措施来解决此问题,并说服g++从系统位置读取string.h?我尝试在不同的机器,Windows 7或8远程桌面上构建相同的库,使用相同的MingW版本 - 所以应该可以做的事情......

1 个答案:

答案 0 :(得分:1)

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

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