¿Como creo un ejecutable sin dependencias?

A menudo me realizan esta pregunta. Actualmente la gran mayoria de los lenguajes de programación corren sobre algún tipo de maquina virtual (C#, VB.Net), o dependen de algún tipo de runtime (VB 6.0, VC++), o directamente son interpretados (Perl, Python). Aún así surge la necesidad a menudo de escribir programa que se ejecuten directamente sin la necesidad de tener más que el ejecutable que deseamos ejecutar, debido a que queremos comodidad, facilidad en el despliegue, o a que necesitamos comprobar precondiciones relacionadas con la existencia o no de interpretes o runtimes que necesitamos para desplegar nuestra aplicación.


En plaforma Windows y utilizando herramientas de desarrollo de Microsoft la única opción con que contamos es utilizar Visual C++ como herramienta de desarrollo, pero ni siquiera esto garantiza el exito. Debemos tener una serie de cuestiones en cuenta.


La primera es que debemos seleccionar el tipo de proyecto adecuado, debe ser un proyecto de tipo MFC, si necesitamos una interfaz gráfica, tipo Win32, si la interfaz gráfica es muy simple o inexsitente o consola si queremos una interfaz de tipo linea de comandos.


Es segundo paso es configurar adecuadamente el proyecto para que el ejecutable que se genere no dependa de librerias externas. Para ello, en Visual Studio 2003 y 2005 debemos dar los siguientes pasos:


En la propiedades del proyecto, en Configuration Properties->General->Use of
MFC selecciona Use MFC in a Static Library, para todas la configuraciones,
tanto Debug como Release. Esto elimina las dependencias de la libreria
MFCxx.dll (MFCDLL Shared Library)


Luego en Configuration Properties->C/C++->Code Generation->Runtime Library
selecciona Multi-threaded Debug (/MTd), para la configuración Debug y
Multi-threaded (/MT), para la configuración Release. Esto elimina la
dependencia de MSVCRxx.dll (Microsoft C Runtime Library) y de MSVCPxx.dll
(Microsoft C++ Runtime Library)


Evidentemente nos vendra a la cabeza el hacer esto en todos nuestros proyectos de Visual C++, pero esto tiene dos desventajas que hay que valorar:


La primera es que el tamaño de nuestro ejecutable crece.
La segunda es que nuestro programa no se beneficia de los parches que Microsoft libere para sus runtime de MFC, C o C++.


Aun existe, siempre utilizando Visual C++, otra opción: La libreria WTL (Windows Template Library), que es un libreria de plantillas de C++ construida directamente sobre el API de Windows. WTL genera unos ejecutables diminutos, extremadamente eficientes y además es una libreria GPL.

11 comentarios sobre “¿Como creo un ejecutable sin dependencias?”

  1. Creo que existen muchas formas y no unica forma de hacer un programa sin dependencias.

    Si la unica herramienta que existiera es Visual C++, lo que comentas es correcto.

    Pero existen otros compiladores y entornos con que tambien se puede lograr.

    Si la intención es usar herramientas visuales modernas para programas con interfaz grafica sin peliar con las dependencias puedes utilizar delphi. Salvo casos muy especiales no necesitas hacer modificaciones en la configuracion.

  2. Hola, muy interesante lo que mencionan. Tengo una pequeña pregunta, espero me puedan ayudar. Estoy desarrollando un proyecto C++ con VS 2008, el cual genera una .dll. En la configuracion tengo Use MFC in a Static Library, Not Using ATL y Multi-threaded(/MT) porque esta en release. Ademas tengo configurado Additional Include Directories y Additional Library Directories para que utlizen las librerias de Microsoft SDK. Esta dll necesita registrarse por lo cual tengo definida la funcion STDAPI DllRegisterServer(). Sin embargo al momento de registrar la .dll por medio de regsvr32 en pc’s que no tienen VS 2008 instalado, arroja un error. Alguna sugerencias. Gracias

  3. @Rodrigo: Gracias por contestar. El error que me genera dice.

    Error al cargar el modulo «xxxx.dll».

    Asegúrese de que el archivo binario está almacenado en la ruta de acceso especificada o depúrelo para comprobar si hay problemas en el archivo binario o los archivos .DLL dependientes.

    Error al iniciar la aplicación; la configuración en paralelo no es correcta. Consulte el registro de eventos de la aplicación para obtener más detalles.

    Saludos !

  4. @Fernando: Todo apunta a que el módulo «xxxx.dll» tiene dependencias dinámicas de alguna dll que se instala con VC++, por ejemplo el runtime de C o el de C++.

    Puedes usar, Depends.exe para ver las dependencias de ese módulo. Si «xxxx.dll» es tuyo, deberías recompilarlo sin dependencias también.

  5. @Rodrigo: utilize el depends.exe para ver las dependencias y resulta que son dll’s del sistema, de la lista resultante, revise una por una para ver si se encontraban en el otro sistema y efectivamente se encontraban todas.

    he cambiado un poco la configuracion del proyecto:

    Debug
    Dynamic Library(.dll)
    Use MFC in a Static Library
    Static Link to ATL
    Use Multi-Byte Character Set
    No Common Language Runtime Support

    Additional Include Directories: «C:Program FilesMicrosoft SDKsWindowsv6.0AInclude»

    Debug Information Format: Program Database for Edit & Continue (/ZI)

    Multi-threaded Debug (/Mtd)

    Compile as C++ Code (/TP)

    Additional Library Directories: «C:Program FilesMicrosoft SDKsWindowsv6.0ALib»

    SubSystem: Windows (/SUBSYSTEM:WINDOWS)

    Target Machine: Not Set

    Gracias de nuevo.
    Fernando.

  6. Problema resuelto, aun no lo he probado en otras maquinas pero parece ser que lo que resolvio el promebla fue 2 cosas:

    1.- Cambiarlo a Release y Multi-threaded (/Mt)

    2.- Instalar el Microsoft Visual C++ 2008 Redistributable Package. http://www.microsoft.com/downloads/details.aspx?familyid=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&displaylang=en

    Como nota adicional, cuando a alguien mas le pase pudiera revisar en el Panel de Control – Herramientas Administrativas – Event Viewer, para conocer la razon de la falla.

    Gracias por la ayuda Rodrigo.

Responder a rcorral Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *