jueves, 14 de agosto de 2014

Preguntas frecuentes: "No hay disco en la unidad"

El título de este post muestra parte de un mensaje de error que aparece frecuentemente en PCs con Windows tras actualizar ZinjaI a su última versión. ZinjaI está lleno errores, algunos que conozco, seguramente cientos que todavía no noté, pero este en particular, y otro que comentaré en el próximo post, no son errores propios. Son "problemas" de Windows (o sus drivers) uno, y del antivirus que lo acompaña el otro. Me cansé de responder consultas a mi correo personal por estos problemas una y otra vez, así que lo publico acá para que cualquiera lo encuentre fácil, y para redireccionar a los próximos que pregunten.

Vamos al problema en cuestión. En muchos sistemas Windows, al iniciar ZinjaI, y al querer compilar cualquier cosa también, pueden aparecer varios carteles con mensajes de "No hay disco en la unidad, inserte un disco en la unidad ...bla bla...". Básicamente, cada vez que se invoca al compilador. ZinjaI lo invoca al iniciarse para consultar su versión y ajustar así en el futuro los argumentos que le va a pasar, y lo invoca obviamente cada vez que hay que compilar algo. A continuación una captura de su versión en inglés que un usuario publicó en el foro:


Estoy hablando de gcc en su versión de mingw32. Por razones técnicas, este compilador requiere a veces de algunas rutas fijas. Para el uso que le damos en ZinjaI, no importa donde lo instalemos, funciona igual. Pero, si por ejemplo queremos agregarle los archivos de internacionalización para que muestre los errores y warnings en castellano (cosa que no recomiendo), tenemos que ponerlos en una carpeta mingw en el raiz de la unidad donde instalamos ZinjaI, y no en la carpeta mingw que hay dentro de ZinjaI (por eso es que ZinjaI por defecto no permite de forma fácil mostrar los mensajes en español en Windows). Volviendo al error, la relación es la siguiente: cada vez que el compilador se inicia se fija si existe esta carpeta en el raiz; y desde la versión 4.8 comenzó a fijarse si existe en todas las raices... es decir si existe c:\mingw, d:\mingw, e:\mingw, etc.

Windows, por errores de configuración, de drivers, o quién sabe de qué, a veces muestra (en el explorador por ejemplo) unidades que no existen o no están listas para usarse. Cuando gcc le consulta la lista de unidades, para luego buscar en sus raíces, recibe la lista completa, incluyendo estas unidades que yo llamo "fantasma". Luego cuando intenta consultar cada una de ellas en busca de la carpeta mingw, al llegar a una unidad fantasma e intentar acceder se produce el error, y Windows muestra ese molesto mensaje.

Lo primero que el usuario debe hacer es identificar cual o cuales son esas unidades fantasma, simplemente abriendo el explorador de archivos e intentando acceder a ellas. Una vez que sabe cuales son, hay una solución temporal, y un parche definitivo. La solución temporal es expulsarla, como si fuera un pendrive, con click derecho en el explorador y seleccionando "expulsar". Esto hace que desaparezca hasta el próximo reinicio de Windows. Para hacer que desaparezca permanentemente, puede ir al administrador de discos, seleccionar la unidad, click derecho, elegir "cambiar letra y rutas de acceso..." y quitarle la letra sin reasignarle ninguna otra. Para llegar al administrador de discos: Panel de control -> Sistema y seguridad -> Herramientas administrativas -> Administración de equipos -> Administración de discos.


Como no se exactamente cual es la causa, tampoco se exactamente cual es la solución, lo que describí son solo "workarounds" que sí sé que se que funcionan. En algunas PCs vi que estas unidades aparecían por culpa de lectores de tarjetas u otro hardware similar conectado internamente como dispositivo usb. Entonces, supongo que la solución ideal sería instalar correctamente estos dispositivos (o tal vez el concentrador usb?), pero como normalmente o bien funcionan igual así, o bien en realidad ni existen, y encontrar qué driver le va bien a un lector genérico no es tan simple, nadie se preocupa mucho. Tal vez sea un problema en mingw o que mingw pueda solucionar cambiando lo forma en que pregunta por las unidades, por el momento está reportado como bug y no tiene una solución definitiva. Si les pasó y lo solucionaron de otra manera no dejen de contarlo en los comentarios.

No hay comentarios:

Publicar un comentario