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
有关。
因此,我通过在g++
命令行添加-v -E
(到"预处理阶段后停止")并更改为-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
,并找到它,即使它不以这样的名称存在!?事实上,如果我从MSYS2bash
外壳中这样做:
$ 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
那么它们都被报告为存在?!
我猜这就是"混淆"g++
的原因,因为它被阻止在系统路径的其他地方/中查找string.h
(微小字母)。从那以后,我发现Git windows区分大小写的文件名没有得到正确处理,并且:
- https://cygwin.com/cygwin-ug-net/using-specialnames.html
虽然NTFS(和一些远程文件系统)支持区分大小写,但从Windows XP开始的NT内核默认情况下不支持它。相反,您必须调整注册表设置并重新启动。因此,Cygwin不支持区分大小写,除非您更改注册表值
如果您真的想在Cygwin中区分大小写,您可以通过将注册表值HKLMSYSTEMCurrentControlSetControlSession Managerkernelobcaseinsensitive
设置为0来打开它,然后重新启动机器。
。。。我做到了,但我仍然有同样的问题;不确定这是否是因为我在MSYS2上使用了MINGW(而不是Cygwin);或者因为像Enable case sensitive behavior with Windows XP and Interix Subsystem或SFU这样的资源引用了HKEY_LOCAL_MACHINESystemCurrentControlSetControlSession ManagerKernelObCaseInsensitive
(注意,大写);然而,我已经有了这些密钥(我只是将其设置为0,然后重新启动),它们带有极小的字母,就像在cygwin.com链接中一样。此外,经过重新启动后的测试,这也没有帮助。
虽然我如何使MinGW对包含的头文件名区分大小写表明这可能无法解决——但我能做些什么来解决这个问题,并说服g++
从系统位置读取string.h
吗?我试过在不同的机器上构建相同的库,Windows 7或8远程桌面,使用相同的MingW版本-所以应该可以做一些事情…
将-I Z:/msys32/mingw32/i686-w64-mingw32/include
添加到命令行的开头不起作用,因为该目录已经在GCC的系统包含目录列表中。我不知道为什么,但这是GCC的行为记录。
最好的解决方案是重命名该库中的头文件,并重命名所有尝试使用它的include。或者,将-I /z/path/to/libA/Include/
与#include <A/B/String.h>
一起使用。#include
指令中的文件夹名称将确保包含库标头而不是系统标头。
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 编译包含字符串的代码时遇到问题
- c++库的公共头文件中应该包含什么
- 将包含C样式数组的对象初始化为成员变量(C++)
- 是否需要删除包含对象的"pair"?
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 使用mongocxx驱动程序时包含头文件问题
- 如何在h文件中包含.o对象文件
- 在混合代码库中将C转换为C++时出现许多包含错误
- VS2017,C++包含目录与附加包含目录,子文件夹包含失败-但为什么
- cmath抛出错误C2062、C2059、C2143和C2447.cmath包含在矢量文件中
- 为什么您需要C++头文件的包含保护
- 无法在UE4中包含BP类到CPP类
- g++ 说函数不存在,即使包含正确的标头
- 在C++代码中包含opencv时,使用ctypes创建.so文件
- Visual C++GC接口如何启用它以及要包含哪个库
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- MSYS2区分大小写并包含在XP上