Este tutorial está hecho con el fin de ayudar a las personas que se animaron y después de algunos intentos, no han podido aún compilar la utilidad TNod User & Password Finder.
El motivo del por qué ahora se usa el compilador de Visual C++ y no MinGW + Code::Blocks como se lo hacía anteriormente, lo expuse al último. Sin más preámbulo, empezamos:
Lo que necesitamos:
1. Microsoft Visual C++ 2008 Express.
2. wxWidgets 2.8.10 (es la última versión hasta esta fecha).
3. El código fuente de TNod User & Password Finder 1.3 Final.
Compilado de wxWidgets 2.8.10
Antes de empezar, daremos por hecho que ya tienes instalado MS Visual C++ 2008 Express, así que continuamos:
1. Instalamos wxWidgets, por facilidad lo haré en C:\wxWidgets-2.8.10.
2. Abrimos el archivo C:\wxWidgets-2.8.10\build\msw\wx.dsw en Visual C++.
3. Nos aparecerá un cuadro de diálogo, el cual presionamos en “Sí a todo”
4. Ahora en el explorador de soluciones tenemos varios proyectos cargados, seleccionamos todos y damos clic en Propiedades.
5. Nos dirigimos a la sección Propiedades de configuración – C/C++ – Generación de código y donde está “Biblioteca en tiempo de ejecución” elegimos “Multiproceso (/MT)”
6. Clic en Aceptar.
7. En la barra de herramientas, en la lista desplegable de configuraciones, elegimos “Release”:
8. En el explorador de soluciones, dar clic derecho en “Solución ‘wx’ (20 proyectos)” y elegir “Generar solución”.
El proceso llevará pocos minutos y mostrará algunos mensajes warning que no daremos importancia. Al terminar ya tendremos listo wxWidgets para realizar cualquier aplicación que deseemos.
Compilado de TNod User & Password Finder 1.3 Final
1. En el directorio de wxWidgets (C:\wxWidgets-2.8.10\) creamos una carpeta “projects” y allí pegamos la CARPETA del código fuente del TNod. Una vez hecho esto, si observamos la dirección en donde está el código fuente pegado, sería en: C:\wxWidgets-2.8.10\projects\TNOD U&P 1.3\
Es importante pegar toda la carpeta para luego no tener problemas con rutas relativas.
2. Ahora entramos a la carpeta “Application” que está dentro de “TNOD U&P 1.3” que recién copiamos.
3. Abrimos el archivo “TNodUP.sln” con Visual C++.
4. En la primera lista desplegable de la barra de herramientas, elegimos “Release”.
5. Vamos al menú Proyecto – Propiedades de TNod. Luego a la sección Propiedades de configuración – C/C++ – Generación de código. Aquí verificamos que en el ítem “Biblioteca en tiempo de ejecución” esté elegido “Multiproceso (/MT)”
6. Clic en Aceptar.
7. Vamos al menú Generar – Generar solución o simplemente presionamos F7.
Listo, ahora si lo deseamos lo podemos ejecutar con F5.
El ejecutable generado, para el caso de este tutorial, quedará en: C:\wxWidgets-2.8.10\projects\TNOD U&P 1.3\Application\vc_msw\
Solución a errores
Lo que mencionaré adelante son las primeras líneas del errores comunes que pueden suceder al compilar TNod, estos errores también podrían pasar al compilar cualquier ejemplo de wxWidgets pero bueno, veamos estos errores:
1>------ Operación Generar iniciada: proyecto: TNod, configuración: Debug Win32 ------
1>Compilando...
1>CNodInfo.cpp
1>c:\wxwidgets-2.8.10\projects\tnod u&p 1.3\application\License.h(9) : fatal error C1083: No se puede abrir el archivo incluir: 'wx/wx.h': No such file or directory
Causa: Mala configuración. Si compilaste wxWidgets con la configuración “Release”, debes hacer lo mismo con cualquier otro proyecto.
Solución: Cambiar la configuración en la lista desplegable de la barra de herramientas de Visual C++, debes elegir la opción “Release”
1>------ Operación Generar iniciada: proyecto: TNod, configuración: Release Win32 ------
1>Compilando...
1>PassServers.cpp
1>c:\wxwidgets-2.8.10\projects\tnod u&p 1.3\application\PassServers.h(39) : fatal error C1083: No se puede abrir el archivo incluir: 'wx/wx.h': No such file or directory
1>License.cpp
1>c:\wxwidgets-2.8.10\projects\tnod u&p 1.3\application\License.h(9) : fatal error C1083: No se puede abrir el archivo incluir: 'wx/wx.h': No such file or directory
Causa: Las rutas de las librerías son incorrectas.
Solución 1: Colocar la carpeta del código fuente del TNod en C:\wxWidgets-2.8.10\projects\ (si no existe la carpeta “projects” la creas manualmente) ya que el archivo de proyecto viene pre-configurado para ejecutarse desde allí.
Solución 2 (aplicable a cualquier proyecto hecho en wxWidgets):
1. Una vez abierto el proyecto de TNod, ir al menú Proyecto – Propiedades de TNod.
2. Ir a la sección Propiedades de configuración – C/C++.
3. Dar clic en “…” que aparecerá al seleccionar el ítem “Directorio de inclusión adicionales”.
4. Dar doble clic en el primer elemento de la lista y presionar en el botón “…”
5. Ahora debes seleccionar la siguiente ruta: C:\wxWidgets-2.8.10\lib\vc_lib\msw\
6. Presionar en Aceptar en los dos cuadros de diálogo y volver a intentar compilar presionando F7.
1>------ Operación Generar iniciada: proyecto: TNod, configuración: Release Win32 ------
1>Compilando...
1>PassServers.cpp
1>License.cpp
1>CNodInfo.cpp
1>CMProcess.cpp
1>BLOWFISH.cpp
1>Generando código...
1>Compilando...
1>tnod.cpp
1>Vinculando...
1>LINK : warning LNK4098: la biblioteca predeterminada'LIBCMT' entra en conflicto con otras bibliotecas; use la biblioteca /NODEFAULTLIB:biblioteca
1>CNodInfo.obj : error LNK2019: símbolo externo "void __cdecl wxOnAssert(char const *,int,char const *,char const *,char const *)" (?wxOnAssert@@YAXPBDH000@Z) sin resolver al que se hace referencia en la función "public: char __thiscall wxStringBase::at(unsigned int)const " (?at@wxStringBase@@QBEDI@Z)
Causa: Mala configuración del proyecto. Si compilaste con la opción “Multiproceso (/MT)”, debes hacer lo mismo con cualquier proyecto hecho en wxWidgets.
Solución:
1. Una vez abierto el proyecto TNod, ir al menú Proyecto – Propiedades de TNod.
2. Ir a la sección Propiedades de configuración – C/C++ – Generación de código.
3. En el ítem “Biblioteca en tiempo de ejecución” asegúrate que esté seleccionado: “Multiproceso (/MT)”
4. Aceptar.
1>------ Operación Generar iniciada: proyecto: TNod, configuración: Release Win32 ------
1>Compilando...
1>PassServers.cpp
1>License.cpp
1>CNodInfo.cpp
1>CMProcess.cpp
1>BLOWFISH.cpp
1>Generando código...
1>Compilando...
1>tnod.cpp
1>Compilando recursos...
1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1
1>Copyright (C) Microsoft Corporation. All rights reserved.
1>Vinculando...
1>MSVCRT.lib(MSVCR90.dll) : error LNK2005: ya se definió _free en LIBCMT.lib(free.obj)
1>MSVCRT.lib(MSVCR90.dll) : error LNK2005: ya se definió _calloc en LIBCMT.lib(calloc.obj)
Causa: Configuración incorrecta en la compilación de wxWidgets.
Solución: Volver a compilar wxWidgets PERO teniendo mucho cuidado en:
a. Seleccionar “Release” en la lista desplegable de la barra de herramientas.
b. Seleccionar a todos los proyectos para cambiar su configuración. Que esté seleccionada la opción “Multiproceso (/MT)” en la configuración del proyecto del TNod.
¿Por qué MS Visual C++?
Los motivos son los siguientes:
1. Se deseaba que la utilidad tenga el menor tamaño posible y el compilador MinGW no ayudaba en este asunto (el tamaño final del ejecutable generado por éste era cercano al doble del generado con Visual C++).
2. No hay nadie mejor que los de la propia Microsoft para la cabecera windows.h, teniéndola siempre actualizada (El que MinGW no tuviera actualizada dicha cabecera trajo consigo inconvenientes en el tema de Balloon Tooltips).
3. Más rápido para compilar aplicaciones hechas en wxWidgets, incluida la librería misma. Podemos comparar los cerca de 3 minutos que toma compilar wxWidgets 2.8.10 en Visual C++ frente a los cerca de 17 que le tomó a MinGW.
En cuanto a IDEs, considero que Code::Blocks supera claramente a Visual C++ ya que dispone de una gran cantidad de plug-ins. Sé que es posible tener Code::Blocks funcionando con el compilador de Visual C++ pero ello requiere de configuraciones adicionales y este tutorial ya está lo suficientemente largo como para aguantar unos kilos demás, podría ser en otro post a futuro si así lo prefieren.
Consideraciones finales
1. Para poder usar cualquier debugger correctamente en wxWidgets, debes compilar éste último con la configuración “Debug”.
2. La configuración de “Multiproceso (/MT)” sirve para que el programa generado no dependa de DLLs propias de Visual C++ y así evitar al usuario el instalar los Distributable, esto hace posible que la utilidad sea portable y no requiera instalación. Como desventaja, aumenta el tamaño del ejecutable final.