2009-05-01 17 views
7

Estoy creando un programa en C++, pero quiero poder ofrecer solo un archivo .exe al usuario. Sin embargo, estoy usando bibliotecas (curl entre otras) que tienen algunos dll. ¿Es posible compilar estos dll en el archivo .exe?C++ Cómo compilar dll en .exe

Uso Code :: Blocks and mingw.

+1

Tenga en cuenta que también puede haber problemas de licencia implicados. P.ej. algunas licencias solo permiten enlaces estáticos si proporciona el código fuente completo de su programa. –

Respuesta

9

Para lograr eso, necesitará static linking. Esto requiere que todas sus bibliotecas (y las bibliotecas de las que dependen recursivamente) deben estar disponibles como bibliotecas estáticas. Tenga en cuenta que el tamaño de su ejecutable será grande, ya que llevará todo el código de esas bibliotecas estáticas. Esta es la razón por la cual las bibliotecas compartidas (DLL) se inventaron en primer lugar, para poder compartir códigos comunes entre las aplicaciones. Sin embargo, eso no siempre funciona so well on windows.

Creo que lo que realmente puede querer es un installer que instala su ejecutable y todas sus bibliotecas dependientes.

+1

Prefiero los portátiles la mayor parte del tiempo, especialmente para las herramientas. El instalador satura mi menú de Inicio, escritorio y lista de programas en Agregar Eliminar programas.Es por eso que me estremezco cada vez que la gente sugiere instaladores para este tipo de preguntas. YMMV. Aún así, votó por el primer párrafo. – syaz

3

Puede utilizar ILMerge

+0

Creo que ILMerge solo funciona con código administrado, no con código nativo. – Ferruccio

+0

Eso es verdad. Supuse que ya que estaban tratando de empaquetar un dll estaban trabajando en .NET – Ichorus

+0

También es cierto que (un dialecto de Microsoft de) C++ se puede compilar en IL. –

2

usted necesita algunas herramientas especiales como packer XBundler.

0

En general, no. Las DLL tienen un comportamiento especial que no es trivial, como adquirir el Bloqueo de cargador cuando se cargan y llamar a DllMain en esos puntos. Mientras que un enlazador teórico podría organizar que cada DllMain sea llamado desde la aplicación main(), no ocurriría bajo Loaded Lock. Este bloqueo de cargador está bajo el control del sistema operativo. Además, las DLL se notifican de nuevos subprocesos a través de su DLLMain, y esto también sería casi imposible de falsificar.

3

Me encontré con la utilidad dll2lib una vez. Una pieza interesante, aunque cara. Le permite convertir virtualmente cualquier dll a una biblioteca estática, que luego puede vincularse con su aplicación para producir un exe sólido. IIRC, la versión gratuita mostrará cierta notificación (MessageBox) al ingresar una función desde dicha biblioteca generada.

4

Hay un artículo en DDJ desde 2002 que puede tener lo que quiere:

Básicamente se utiliza una combinación de vincular a la DLL utilizando la función de MSVC 'carga retardada' y envasado la DLL como un recurso incrustado en el EXE. La DLL se extrae automáticamente en tiempo de ejecución cuando se realiza la primera llamada a una de las exportaciones.

No he usado esta técnica, así que no puedo comentar sobre qué tan bien funciona, pero parece una idea astuta.

2

Si realmente necesita lograr esto, puede utilizar esta impresionante biblioteca que le permitirá cargar una DLL desde la memoria. Lo he usado para leer un archivo DLL de un recurso y cargarlo para mí.

https://github.com/fancycode/MemoryModule

Cuestiones relacionadas