viernes, 1 de marzo de 2019

Cl.exe y Case Sentitivity en Windows (*.cpp: error C1033: cannot open program database '*.pdb')

Esta es la primera entrada que escribo y tiene que ver con los problemas sufridos con Case Sensitivity en Windows. El problema resulta a la hora de mezclar herramientas de Windows con Cygwin u otra consola que emule linux en Windows.

Por si no lo sabéis, desde hace un tiempo Windows permite utilizar case sensitive dentro de su sistema de ficheros. Para Windows por defecto lo deja desactivado, para comprobar si esta activado, podéis utilizar la herramienta fsutils.exe y podéis ir comprobando el estado mediante la siguiente línea:

> fsutil.exe file queryCaseSensitiveInfo "<path>"

El resultado os dirá si el <path> es case sensitive o no. Este atributo lo podéis cambiar con las siguientes líneas:

> fsutil.exe file setCaseSensitiveInfo "<path>" disable 
> fsutil.exe file setCaseSensitiveInfo "<path>" enable

Bueno vuelta al problema, si para Windows por defecto es Case Insensitive, en el caso de las herramientas que emulan las terminales de linux en Windows como Cygwin, por defecto es lo contrario, es decir es Case Sensitive cuando creas una carpeta con mkdir u otro comando.

El problema de esta entrada aparece con los directorios Case Sensitive en Windows y la herramienta de compilación cl.exe, concretamente, a mi me ha pasado con el flag \Zi de la propia herramienta que hace que se genere la información de debug. cl.exe a la hora de crear el fichero de salida la ruta para crearlo es case insensitive y toda en minúsculas. Por lo que si tenemos alguna ruta que esté con alguna mayúscula (fijaros que mi carpeta de output se llama /Build/Debug y en mi caso está se había creado con mkdir en cygwin), nos dará fallo, concretamente el siguiente fallo:

> CL /c /nologo /Fd./Build/Debug/ /W3 /DWIN32 /DO_LE /D_CRT_SECURE_NO_WARNINGS /D_SCL_SECURE_NO_WARNINGS /EHs /EHc- /GR /MDd /D_DEBUG /Zi /RTCsu /DMAJOR= /DMINOR= /DBETA= /D__DEBUG__ /D__i386__ /D__safety_integrity_level__=0 /Od /I./Include /Fo./Build/Debug/example.obj ../Src/example.cpp
../Src/example.cpp : fatal error C1033: cannot open program database 'build\debug\vc100.pdb'

Por lo que basta con cambiar el atributo al path tal y como hemos dicho al principio y problema resuelto:

> fsutil.exe file setCaseSensitiveInfo "C:/<mi_ruta>/Build/Debug" disable
Case sensitive attribute on directory C:\myPath\Build is disabled. 

Para realizar esto de una manera más rápida, he creado un script para Cygwin que recorre todo el sistema de ficheros desde un punto y hace de manera recursiva el cambio a insensitive, os lo dejo por si lo quereis:

> find.exe <mi_ruta>/ -type d | xargs -I % fsutil.exe file setCaseSensitiveInfo "%" disable

Espero que os sirva y si es así, un comentario dando las gracias tampoco estaría mal.

No hay comentarios:

Publicar un comentario

Problemas con python "/usr/bin/env &lt; &lt; python&gt;&gt;: No such file or directory "

Es posible que hayas llegado aquí por un mensaje similar al siguiente:  /usr/bin/env: <<python>>: No such file or directory   Cu...