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:
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:
Créez le répertoire C:\build
et exécutez la commande suivante dans l’invite de commande:
cd c:\build
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
Nous devons d’abord construire un zlib
statique. Pour ce faire, nous devons d’abord modifier certains fichiers de configuration:
zlib
: cd C:\build\zlib
Editez le fichier win32\Makefile.msc
:
CFLAGS
-MD
par -GL -MT -Zc:wchar_t-
LDFLAGS
-debug
par -opt:icf -dynamicbase -nxcompat -ltcg /nodefaultlib:msvcrt
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"
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\
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\
Maintenant, apportez les modifications suivantes au fichier C:\build\openssl\makefile
:
CFLAG
/Zc:wchar_t- /GL /Zi
LDFLAGS
/debug
par /incremental:no /opt:icf /dynamicbase /nxcompat /ltcg /nodefaultlib:msvcrt
EX_LIBS
ZLIB1
par zlib.lib
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.