Pregunta

Estoy creando un programa 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?

Uso Code :: Blocks y mingw.

¿Fue útil?

Solución

Para lograrlo, necesitará enlace estático . Esto requiere que todas sus bibliotecas (y las bibliotecas de las que dependen recursivamente) necesiten 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. Es por eso que las bibliotecas compartidas (DLL) se inventaron en primer lugar, para poder compartir código común entre aplicaciones. Sin embargo, eso no siempre funciona tan bien en Windows .

Creo que lo que realmente puede desear es un instalador que instala su ejecutable y todo depende bibliotecas.

Otros consejos

Hay un artículo en DDJ de 2002 que puede tener lo que quieres:

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

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

Puede usar ILMerge

Me encontré con dll2lib una vez. Pieza interesante, aunque cara. Le permite convertir prácticamente 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 de dicha biblioteca generada.

Necesitas algunas herramientas especiales para empacar como XBundler .

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

https://github.com/fancycode/MemoryModule

En general, no. Las DLL tienen algún comportamiento especial que no es trivial, como adquirir Loader Lock cuando se cargan y llamar a DllMain en esos puntos. Si bien un enlazador teórico podría hacer que se llame a cada DllMain desde la aplicación main (), no sucedería bajo Loaded Lock. Este bloqueo del cargador está bajo el control del sistema operativo. Además, a los DLL se les notifica los nuevos hilos a través de su DLLMain, y esto también sería casi imposible de falsificar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top