我正在尝试使用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版本 - 所以应该可以做的事情......
答案 0 :(得分:1)
将-I Z:/msys32/mingw32/i686-w64-mingw32/include
添加到命令行的开头不起作用,因为该目录已经在GCC的系统包含目录列表中。我不确定为什么,但这是GCC记录的行为。
最佳解决方案是重命名该库中的头文件,并重命名尝试使用它的所有包含。或者,使用-I /z/path/to/libA/Include/
和#include <A/B/String.h>
。 #include
指令中的文件夹名称将确保包含库头而不是系统头。