Comment puis-je créer OpenSSL lié statiquement à l’exécution de Windows?

Je travaille sur une application C ++ pour Windows qui utilise la bibliothèque OpenSSL 1.0.1e. Je suis sur Visual Studio 2008.

Pour des raisons de portabilité, mon application est liée de manière statique aux bibliothèques d’exécution (options /MT et /MTd ). Et je n’expédie pas de librairies d’exécution avec mon application.

Selon la FAQ OpenSSL , la bibliothèque est par défaut liée au runtime DLL multithread ( /MDd ), ce qui est évidemment incompatible avec mon scénario. Pour que mon programme fonctionne, j’ai ajouté applink.c à mon projet. Sur mon ordinateur de développement et sur la plupart des ordinateurs de test, le programme fonctionne correctement.

Mais malheureusement, j’ai localisé des ordinateurs sur lesquels l’application ne démarre pas. Windows affiche une erreur:

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

J’ai ouvert libeay32.dll dans Dependency Walker et je vois que MSVCR90.dll est introuvable. Donc, le truc avec applink.c ne fonctionne pas vraiment pour moi.

Comment créer OpenSSL avec l’option /MT ou /MTd ?

Utilisez le nt.mak plutôt que le ntdll.mak .

En passant, j’ai écrit des scripts autour des scripts de construction OpenSSL standard qui facilitent (pour moi au moins) l’utilisation d’OpenSSL sur Windows avec un mélange de x86 et de x64, vous pouvez les obtenir ici .

L’option la plus élégante que j’ai trouvée pour Windows consiste à utiliser les scripts fournis à l’ adresse http://p-nand-q.com/programming/windows/building_openssl_with_visual_studio_2013.html.

Ils fournissent des scripts pour VS2010 / VS2013 / VS2015 pour chaque version de script qu’il génère toutes les combinaisons de x86 / x86-64 avec les environnements d’exécution MDd / MD / MTd / MT.

Citant les instructions:

CONDITIONS PRÉALABLES:

Le script suppose que vous êtes sous Windows.

Le script suppose que Visual Studio 2010, 2013 ou 2015 est installé à tous les endroits habituels. Important: Si vous avez un dossier d’installation différent, votre kilométrage peut varier

Le script suppose que vous avez téléchargé une archive OpenSSL, comme celle-ci.

Le script suppose que Python (2.7 ou 3.x) est installé sur votre PATH

Le script suppose que 7-zip est installé (il n’a pas besoin d’être sur votre PATH) Choisissez le script que vous souhaitez utiliser et modifiez-le. Par exemple, regardons en haut de rebuild_openssl_vs2015.cmd:

T:

set OPENSSL_VERSION = 1.0.1p

set SEVENZIP = “C: \ Program Files \ 7-Zip \ 7z.exe”

set VS2015 = “C: \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ VC \ bin \ vcvars32.bat”

set VS2015_AMD64 = “C: \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ VC \ bin \ amd64 \ vcvars64.bat”

donc il est assez facile à voir: vous devez entrer la version OpenSSL manuellement, le rest devrait avoir des valeurs par défaut raisonnables …

Remarque: Le script utilise le lecteur SUBST T: \ pour créer OpenSSL.

J’ai testé et ça marche, en moins de 10 min! KUDOS pour les auteurs des scripts !!

UPDATE: Pour les générations x64 à générer, vous devez installer nasm assembler et l’avoir dans le PATH.

Si vous voulez des bibliothèques OpenSSL précompilées avec MT, regardez ici: http://www.npcglib.org/~stathis/blog/precomstackd-openssl/ Vous trouverez un patch pour les sources OpenSSL qui permet de produire des bibliothèques avec les suffixes MT / MD et ” d “pour déboguer afin de faciliter l’identification des bibliothèques.

De plus, vous trouverez également le script de construction pour les construire tous en même temps pour de nombreuses versions différentes de Visual Studio. Je les construis et les utilise moi-même pour produire exactement des binarys ne nécessitant aucune DLL pour mes projets et vous les trouverez peut-être utiles.

Pour créer OpenSSL 64 bits lié de manière statique (qui génère un seul fichier .exe sans DLL) avec Visual Studio 2015, vous devez disposer des conditions préalables suivantes:

  • Git pour Windows. Vous pouvez le télécharger sur https://git-scm.com/download/win . Ce guide utilise la version 2.11.0.3 .
  • Perl aux fraises Vous pouvez le télécharger sur http://strawberryperl.com/ (Attention: ActivePerl est fortement déconseillé. Cela vous donnera des erreurs étranges pendant le processus). Ce guide utilise la version 5.24.1.1 .
  • Assembleur NASM, disponible sur http://www.nasm.us/ . Ce guide utilise la version 2.12.03rc1 .

Vous devez installer tous ces outils à l’échelle du système et les append à votre variable d’environnement %PATH% .

Une fois que vous avez tout ce dont vous avez besoin, suivez simplement ces étapes simples:

  1. Ouvrez l’ invite de commande Native Tools VS2015 x64 à partir de votre menu Démarrer. Vous verrez l’invite de commande.
  2. Créez le répertoire C:\build et exécutez la commande suivante dans l’invite de commande:

    • cd c:\build
  3. Téléchargez les derniers codes sources zlib et OpenSSL dans votre répertoire de build en utilisant les commandes suivantes:

    • git clone https://github.com/madler/zlib
    • git clone https://github.com/openssl/openssl
  4. Nous devons d’abord construire un zlib statique. Pour ce faire, nous devons d’abord modifier certains fichiers de configuration:

    • Naviguez jusqu’au dossier source zlib : cd C:\build\zlib
    • Editez le fichier win32\Makefile.msc :

      1. Trouvez la ligne commençant par CFLAGS
      2. Remplacez -MD par -GL -MT -Zc:wchar_t-
      3. Trouvez la ligne commençant par LDFLAGS
      4. Remplacez -debug par -opt:icf -dynamicbase -nxcompat -ltcg /nodefaultlib:msvcrt
  5. Construisez zlib utilisant la commande suivante (devrait prendre moins d’une minute):

    • nmake -f win32/Makefile.msc AS=ml64 LOC="-DASMV -DASMINF -DNDEBUG -I." OBJA="inffasx64.obj gvmat64.obj inffas8664.obj"
  6. Copiez les fichiers résultants dans votre répertoire OpenSSL :

    • 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. Naviguez vers la source OpenSSL : cd C:\build\openssl\ et configurez-le pour utiliser les fichiers de configuration zlib & read statiques ( openssl.cnf ) du openssl.cnf C:\Windows\ .

    • perl Configure VC-WIN64A no-shared zlib no-zlib-dynamic threads --prefix=C:\Windows\
  8. Maintenant, apportez les modifications suivantes au fichier C:\build\openssl\makefile :

    • Trouvez la ligne qui commence par: CFLAG
    • Append: /Zc:wchar_t- /GL /Zi
    • Trouvez la ligne qui commence par: LDFLAGS
    • Remplacez /debug par /incremental:no /opt:icf /dynamicbase /nxcompat /ltcg /nodefaultlib:msvcrt
    • Trouvez la ligne qui commence par: EX_LIBS
    • Remplacez ZLIB1 par zlib.lib
    • Sauvegarder les modifications
  9. Construisez OpenSSL en lançant la commande nmake (environ 15 minutes).

Le fichier openssl.exe ~ 3Mo openssl.exe sera situé dans le répertoire C:\build\openssl\apps\ . Il est entièrement portable, car toutes les DLL sont incluses. Si vous devez utiliser un fichier de configuration personnalisé, copiez C:\build\openssl\apps\openssl.cnf dans votre C:\build\openssl\apps\openssl.cnf C:\Windows\ et modifiez-le à votre convenance.