2016-06-06 1 views
1

J'essaye de compiler un projet sur XP avec MSYS2 (msys2-base-i686-20160205.tar.xz). L'un des fichiers inclus est comme:Sensibilité à la casse MSYS2 et inclut sur XP?

/z/path/to/libA/Include/A/B/String.h 

Ce fichier, à son tour, fait dans sa ligne 34:

#include <string.h> 

Ce fichier existe déjà, dire:

Z:/msys32/mingw32/i686-w64-mingw32/include/string.h 

. .. où le lecteur Z: est également l'emplacement de mon code. Sur ma ligne de compilation g++, j'ai d'abord -I Z:/msys32/mingw32/i686-w64-mingw32/include, et après beaucoup d'inclusions, -I /z/path/to/libA/Include/A/B. Toutefois, lorsque j'essaie de compiler, la compilation échoue, liée à String.h.

Donc, je visitai un peu en ajoutant -v -E (pour « arrêter après l'étape de pré-traitement ») et le changement de -o File.e à la ligne de commande g++, et peut le voir dans les résultant 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 
... 

Comme Je comprends cela, le préprocesseur arrive à la ligne 34 de Z:/path/to/libA/Include/A/B/String.h, voit le #include <string.h>, commence à chercher string.h dans le répertoire courant - et le trouve, même s'il n'existe pas sous un tel nom !? En effet, si je fais de la coquille MSYS2 bash:

$ find Z:/path/to/libA/Include/A/B/ -name 'string.h' 

... rien est retourné (en String.h, capitalisés, se trouve); Toutefois, si je force une liste soit non capitalisé ou le nom capitalisé:

$ 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 

... ils sont tous deux signalés comme existant ?!

Je suppose que c'est ce qui "confond" g++, dans le sens où il est empêché de rechercher string.h (minuscules) ailleurs/dans le chemin du système. Depuis, je l'ai trouvé Git-windows case sensitive file names not handled properly et:

Bien que NTFS (et certains systèmes de fichiers à distance) sensibilité à la casse de support, le noyau NT à partir de Windows XP ne prend pas en charge par défaut . Au contraire, vous devez modifier un paramètre de registre et redémarrer. Pour cette raison, la sensibilité à la casse ne peut pas être prise en charge par Cygwin, sauf si vous modifiez cette valeur de registre.
Si vous voulez vraiment la casse dans Cygwin, vous pouvez l'activer en définissant la valeur de Registre
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\kernel\obcaseinsensitive
à 0 et redémarrer la machine.

... et j'ai fait cela, mais j'ai toujours le même problème; Je ne sais pas si c'est parce que j'utilise MINGW sur MSYS2 (pas Cygwin); ou parce que des ressources telles que Enable case sensitive behavior with Windows XP and Interix Subsystem or SFU font référence à HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Kernel\ObCaseInsensitive (notez, en majuscules); Cependant, j'avais déjà ces clés (je l'ai juste mis à 0, et redémarré), et ils étaient avec des minuscules, comme dans le lien cygwin.com. En outre, testé après le redémarrage, cela n'a pas aidé non plus.

Alors que How can I make MinGW case-sensitive for included header file names indique cela peut ne pas être possible de résoudre - est-ce que je peux faire pour résoudre ce problème, et de persuader g++ de lire le string.h de l'emplacement du système? J'ai essayé de construire la même bibliothèque sur une machine différente, Windows 7 ou 8, avec la même version de MingW où il a fonctionné - donc quelque chose devrait être possible de faire ...

Répondre

1

Ajoutez -I Z:/msys32/mingw32/i686-w64-mingw32/include au début de votre La ligne de commande n'a pas fonctionné car ce répertoire figure déjà dans la liste des répertoires d'inclusion système de GCC. Je ne sais pas pourquoi, mais c'est un comportement documenté de GCC.

La meilleure solution consiste à renommer le fichier d'en-tête dans cette bibliothèque et à renommer tous les includes qui tentent de l'utiliser. Vous pouvez également utiliser -I /z/path/to/libA/Include/ avec #include <A/B/String.h>. Les noms de dossier de la directive #include s'assurent que l'en-tête de la bibliothèque est inclus à la place de l'en-tête système.

+0

Merci beaucoup, @DavidGrayson - va certainement essayer; à votre santé! – sdaau