gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:26:38 33 4
gpt4 key购买 nike

我正在尝试使用 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 进行了一些检查(“在预处理阶段后停止”)并更改为 -o File.eg++命令行,并可以在生成的 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外壳:

$ 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 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 (注意,大写);但是,我已经有了这些 key (我只是将其设置为 0,然后重新启动),并且它们带有微小的字母,就像在 cygwin.com 链接中一样。此外,重启后进行测试,这也没有帮助。

同时 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 记录的行为。

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

关于c++ - MSYS2 区分大小写并包含在 XP 上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37662307/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com