¿Cómo construyo OpenSSL enlazado estáticamente contra el tiempo de ejecución de Windows?

8 minutos de lectura

avatar de usuario
usuario2724991

Estoy trabajando en una aplicación C++ para Windows que usa la biblioteca OpenSSL 1.0.1e. Estoy en Visual Studio 2008.

Por razones de portabilidad, mi aplicación está vinculada estáticamente con las bibliotecas de tiempo de ejecución (/MT y /MTd opciones). Y no envío bibliotecas de tiempo de ejecución con mi aplicación.

por el Preguntas frecuentes sobre OpenSSLla biblioteca está vinculada de forma predeterminada con el tiempo de ejecución de DLL multiproceso (/MDd) que obviamente es incompatible con mi escenario. Entonces, para que mi programa funcione, he agregado applink.c a mi proyecto En mi máquina de desarrollo y en la mayoría de las computadoras de prueba, el programa funciona bien.

Pero, lamentablemente, he localizado equipos en los que la aplicación no se inicia. Windows muestra el error:

The application failed to initialize properly (0xc0150002). Click on OK to
terminate the application. 

he abierto libeay32.dll en Dependency Walker y veo que MSVCR90.dll no se encuentra. Así que el truco con applink.c realmente no funciona para mí.

¿Cómo construyo OpenSSL con /MT o /MTd ¿opción?

  • “Pero lamentablemente he localizado equipos donde la aplicación no arranca… Veo que no se encuentra MSVCR90.dll” – asegúrese de que las computadoras con problemas tengan la versión adecuada del tiempo de ejecución de MSVC. Puede descargarlos desde el sitio de Microsoft. Deben estar incluidos en su paquete de instalación.

    – jww

    23 de agosto de 2014 a las 1:37


  • Tengo el mismo problema, openssl 1.1.1c compilado en Windows 10, y usando su libssl-1_1-x64.dll y libcrypto-1_1-x64.dll, obtengo el error de tiempo de ejecución msvcrt90.dll no encontrado. Después de copiar msvcrt90.dll junto a los archivos cpp, aparece el error R6034. 🙁

    – Hamed_gibago

    20 de julio de 2019 a las 12:26

Utilizar el nt.mak makefile en lugar del ntdll.mak archivo MAKE.

Aparte, he escrito algunos scripts en torno a los scripts de compilación estándar de OpenSSL que hacen que sea ‘más fácil’ (al menos para mí) usar OpenSSL en Windows con una combinación de x86 y x64, puede obtenerlos de aquí.

  • Sí, lo encontré. Muchas gracias.

    – usuario2724991

    28 de agosto de 2013 a las 11:44

  • Ayuda, ¿cómo compilo para /MTd?

    – Lefteris E.

    25 de junio de 2014 a las 6:34

  • En “Install.w32” en la distribución de OpenSSL hay esta nota: “Hay varios cambios que puede realizar en el entorno de compilación de Win32. De manera predeterminada, la biblioteca no está compilada con símbolos de depuración. Si agrega ‘depuración’ a mk1mf.pl líneas en el archivo por lotes do_*, luego se compilarán los símbolos de depuración. Tenga en cuenta que mk1mf.pl espera que la plataforma sea el último argumento en la línea de comando, por lo que ‘depurar’ debe aparecer antes de eso, como todas las demás opciones”. O use nt-dbg.mak

    – Len Holgate

    25/06/2014 a las 20:54

  • no usa nt.mak en lugar de ntdll.mak crea bibliotecas OpenSSL estáticas en lugar de bibliotecas dinámicas con tiempo de ejecución vinculado estáticamente?

    – Bobeff

    23/08/2017 a las 19:50

Para compilar OpenSSL de 64 bits vinculado estáticamente (lo que da como resultado un solo archivo .exe sin DLL) con Visual Studio 2015, necesitará los siguientes requisitos previos:

Se espera que instale todas esas herramientas en todo el sistema y las agregue a su %PATH% variable ambiental.

Después de obtener todo lo que necesitamos, solo siga estos sencillos pasos:

  1. Abierto Símbolo del sistema de herramientas nativas VS2015 x64 desde tu Menú Inicio. Verá el símbolo del sistema.
  2. Crear C:\build directorio y emita el siguiente comando en el símbolo del sistema:

    • cd c:\build
  3. Descargue los últimos códigos fuente de zlib y OpenSSL en su build dir usando los siguientes comandos:

    • git clone https://github.com/madler/zlib
    • git clone https://github.com/openssl/openssl
  4. Primero tenemos que construir estática zlib. Para hacer eso primero necesitaremos editar algunos archivos de configuración:

    • Navegar a la zlib Carpeta de origen: cd C:\build\zlib
    • Editar el win32\Makefile.msc expediente:

      1. Encuentre la línea que comienza con CFLAGS
      2. Reemplazar -MD con -GL -MT -Zc:wchar_t-
      3. Encuentre la línea que comienza con LDFLAGS
      4. Reemplazar -debug con -opt:icf -dynamicbase -nxcompat -ltcg /nodefaultlib:msvcrt
  5. Construir zlib usando el siguiente comando (debe tomar menos de un minuto):

    • nmake -f win32/Makefile.msc AS=ml64 LOC="-DASMV -DASMINF -DNDEBUG -I." OBJA="inffasx64.obj gvmat64.obj inffas8664.obj"
  6. Copie los archivos resultantes a su OpenSSL directorio:

    • xcopy zlib.h C:\build\openssl\
    • xcopy zconf.h C:\build\openssl\
    • xcopy zlib.lib C:\build\openssl\
    • xcopy zlib.pdb C:\build\openssl\
  7. Navegar a OpenSSL fuente: cd C:\build\openssl\ y configurarlo para usar zlib estático y leer archivos de configuración (openssl.cnf) desde C:\Windows\ directorio.

    • perl Configure VC-WIN64A no-shared zlib no-zlib-dynamic threads --prefix=C:\Windows\
  8. Ahora haga las siguientes ediciones en el C:\build\openssl\makefile:

    • Encuentra la línea que comienza con: CFLAG
    • Adjuntar: /Zc:wchar_t- /GL /Zi
    • Encuentra la línea que comienza con: LDFLAGS
    • Reemplazar /debug con /incremental:no /opt:icf /dynamicbase /nxcompat /ltcg /nodefaultlib:msvcrt
    • Encuentra la línea que comienza con: EX_LIBS
    • Reemplazar ZLIB1 con zlib.lib
    • Guardar cambios
  9. Construir OpenSSL emitiendo el nmake comando (tomará alrededor de 15 minutos).

Los ~3MB resultantes openssl.exe archivo se ubicará en C:\build\openssl\apps\ directorio. Es totalmente portátil, ya que todas las DLL están incluidas. Si necesita usar un archivo de configuración personalizado, copie C:\build\openssl\apps\openssl.cnf para usted C:\Windows\ directorio y edítelo a su gusto.

  • la pregunta decía que el enlace contra el tiempo de ejecución estático de Windows no compila el código estáticamente, hay una diferencia

    – simon-pr

    9 de julio de 2017 a las 20:24

  • @simon-pr puede aclarar (eli5) la diferencia por favor?

    – Anubioz

    9 de abril de 2019 a las 16:33

avatar de usuario
Fernando González Sánchez

La opción más elegante que he encontrado para Windows consiste en utilizar los scripts proporcionados en http://p-nand-q.com/programming/windows/building_openssl_with_visual_studio_2013.html

Proporcionan scripts para VS2010/VS2013/VS2015 para cada versión de script que genera todas las combinaciones de x86/x86-64 con tiempos de ejecución MDd/MD/MTd/MT.

Citando las instrucciones:

PRERREQUISITOS:

El script asume que estás en Windows.

El script asume que tiene instalado Visual Studio 2010, 2013 o 2015 en todos los lugares habituales. Importante: si tiene una carpeta de instalación diferente, su kilometraje puede variar

El script asume que ha descargado un tarball de OpenSSL, como este.

El script asume que tiene Python (2.7 o 3.x) instalado y en su RUTA

El script asume que tiene instalado 7-zip (no es necesario que esté en su RUTA). Elija el script que desea usar y edítelo. Por ejemplo, echemos un vistazo a la parte superior de rebuild_openssl_vs2015.cmd:

T:

establecer OPENSSL_VERSION=1.0.1p

establecer SEVENZIP=”C:\Archivos de programa\7-Zip\7z.exe”

establecer VS2015=”C:\Archivos de programa (x86)\Microsoft Visual Studio 14.0\VC\bin\vcvars32.bat”

establecer VS2015_AMD64=”C:\Archivos de programa (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\vcvars64.bat”

por lo que es bastante fácil de ver: debe ingresar la versión de OpenSSL manualmente, el resto debe tener valores predeterminados razonables…

Nota: El script usa la unidad SUBST T:\ para compilar OpenSSL.

Lo probé y funciona, ¡en menos de 10 min! KUDOS para los autores de los guiones!!

ACTUALIZACIÓN: para que se generen las compilaciones x64, debe instalar el ensamblador nasm y tenerlo en la RUTA.

Si desea bibliotecas OpenSSL precompiladas con MT, consulte aquí: http://www.npcglib.org/~stathis/blog/precompiled-openssl/
Encontrará un parche para las fuentes OpenSSL que permite producir bibliotecas con los sufijos MT/MD y “d” para depuración para facilitar la identificación de las bibliotecas.

Además, también encontrará el script de compilación real para compilarlos todos a la vez para muchas versiones diferentes de Visual Studio. Los construyo y uso yo mismo para producir archivos binarios que no necesitan archivos DLL para mis proyectos y puede que los encuentre útiles.

Parece que OpenSSL ahora se vincula con -MT -Zl (al menos cuando se usa msvc), lo que significa que descarta las bibliotecas con nombre predeterminadas que luego se deciden en su binario final. Las aplicaciones parecen utilizar el tiempo de ejecución estático de forma predeterminada.

En otras palabras, no es necesario realizar ninguna acción para usarlo con su binario, solo proporcione el indicador que desee y la biblioteca OpenSSL simplemente funcionará con él. Desafortunadamente, no hay mucha documentación concreta sobre la construcción de una biblioteca tan importante.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad