Comment puis-je construire OpenSSL lié statiquement contre l'exécution de Windows?
Je suis en train de travailler sur une application C++ pour Windows qui utilise OpenSSL 1.0.1 e de la bibliothèque. Je suis sur Visual Studio 2008.
Pour des raisons de portabilité de mon application est lié statiquement à l'encontre des bibliothèques d'exécution (/MT
et /MTd
options). Et je ne livrons pas le runtime libs avec mon application.
Par la OpenSSL FAQ, la bibliothèque est par défaut lié à l'encontre multithread DLL runtime (/MDd
) ce qui est évidemment incompatible avec mon scénario. Donc, pour faire mon programme de travail, j'ai ajouté applink.c
à mon projet. Sur ma machine de dev et sur la plupart des ordinateurs de test le programme fonctionne très bien.
Mais malheureusement, j'ai situé les ordinateurs où l'application ne démarre pas. Windows affiche l'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
n'est pas trouvé. Donc, l'astuce avec applink.c
ne fonctionne pas vraiment pour moi.
Comment puis-je construire OpenSSL avec /MT
ou /MTd
option?
OriginalL'auteur user2724991 | 2013-08-28
Vous devez vous connecter pour publier un commentaire.
Utiliser le
nt.mak
makefile plutôt que de lantdll.mak
makefile.En aparté, j'ai écrit quelques scripts autour de la norme OpenSSL créer des scripts qui font qu'il est "plus facile" (pour moi au moins) à utiliser OpenSSL sur Windows avec un mélange des deux x86 et x64, vous pouvez les obtenir à partir de ici.
L'aide, comment puis-je compiler pour /MTd ?
Dans "Installer.w32" dans OpenSSL distribution, il y a cette remarque: "Il y a plusieurs changements que vous pouvez faire à la Win32 environnement de compilation. Par défaut, la bibliothèque n'est pas compilé avec les symboles de débogage. Si vous ajoutez 'debug' à la mk1mf.pl les lignes dans le do_* fichier de commandes puis les symboles de débogage sera compilé. Notez que mk1mf.pl s'attend à ce que la plate-forme pour être le dernier argument sur la ligne de commande, donc 'debug' doit apparaître avant que, comme toutes les autres options."... Ou utiliser nt-dbg.mak
N'utilisez pas
nt.mak
au lieu dentdll.mak
crée statiques des bibliothèques OpenSSL au lieu de bibliothèques dynamiques avec statiquement d'exécution?OriginalL'auteur Len Holgate
La plus élégante de l'option que j'ai trouvé pour Windows consiste à utiliser les scripts fournis à 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 du script qu'il construit de toutes les combinaisons de x86/x86-64 avec runtimes MDd/MD/MTd/MT.
Citant les instructions:
Je l'ai testé et il fonctionne, en moins de 10 min! BRAVO pour les auteurs de l'scripts!!
Mise à JOUR: Pour le x64 construit pour être généré, vous devez installer des msna de l'assembleur et l'avoir dans le CHEMIN.
OriginalL'auteur Fernando Gonzalez Sanchez
Si vous voulez précompilés bibliothèques OpenSSL avec MT regardez ici: http://www.npcglib.org/~stathis/blog/précompilés-openssl/
Vous trouverez un patch pour le OpenSSL sources qui permet de produire des bibliothèques avec des suffixes MT/MD et "d" pour le débogage à l'identification des bibliothèques plus facile.
Quoi de plus, vous pourrez également trouver le script de construction pour construire toutes à la fois pour différentes version de Visual Studio. - Je construire et les utiliser moi-même exactement à produire des binaires qui n'ont pas besoin de Dll pour mes projets, et vous pouvez les trouver utiles.
Cela n'a rien à voir avec OpenSSL, mais si vous mélangez la liaison statique (/MT) et dynamique (/MD) C temps de fonctionnement vous vous dirigez vers une jolie coquine se bloque qui sera très difficile à déboguer. Peut-être que vous pouvez nous montrer comment vous avez mélangé les deux et quels en étaient les résultats. En attendant: "Donc, si vous cherchez à construire des bibliothèques statiques compilé avec /MD[d]" ... merci de ne pas le faire. d'être cohérente et vous épargner la peine, surtout avec les vieux MSVC.
J'ai besoin d'openssl que les bibliothèques statiques compilé avec /MD[d], comme je suis bâtiment statiquement DLL pour diverses raisons qui ont beaucoup à faire avec les clients et rien à voir avec le fait de faire de la R&D de plus amusant. Croyez-moi, si il y avait une autre option, je l'aurais pris. Être reconnaissants que vous n'avez jamais besoin.
votre blog m'a sauvé la vie tekhedd.com/?p=2305 Par la façon dont il travaille avec l'asm pour moi et je suis de piratage du nt.mak via powershell, dans l'ensemble, mon lot de fichier ressemble à ça: appel cd src\openssl-1.0.2 k appel "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcvarsall.chauve-souris" call set path=C:\Perl64\bin;C:\Users\m\AppData\Local\NASM;%path% appel perl Configurer VC-WIN32 --prefix="../../build/1.0.2 k-x86_rel_MD" appel ms\do_nasm.chauve-souris powershell -Commande "(Get-Content ms\nt.mak).replace('/MT', '/MD') | Set-Content ms\nt.mak" appel nmake -f ms\nt.mak appel nmake -f ms\nt.mak installer
Content que cela a été utile! Permettez-moi d'ajouter votre code pour le blog? Cela peut aider quelqu'un d'autre un jour. Ou même moi.
OriginalL'auteur sigma
De construire 64 bits OpenSSL lié statiquement (qui résulte en une seule .exe fichier sans aucune Dll) avec Visual Studio 2015, vous aurez besoin de remplir les conditions suivantes:
Vous êtes attendus pour installer tous ces outils à l'échelle du système et de les ajouter à votre
%PATH%
variable d'environnement.Après avoir obtenu tout ce dont nous avons besoin, il suffit de suivre ce simple suit:
Créer
C:\build
répertoire et tapez la commande suivante dans l'invite de commande:cd c:\build
Télécharger la dernière zlib & OpenSSL les codes sources de votre
build
dir en utilisant les commandes suivantes:git clone https://github.com/madler/zlib
git clone https://github.com/openssl/openssl
Nous devons d'abord construire statique
zlib
. Pour ce faire nous allons d'abord besoin de modifier certains fichiers de configuration:zlib
dossier source:cd C:\build\zlib
Modifier le
win32\Makefile.msc
fichier:CFLAGS
-MD
avec-GL -MT -Zc:wchar_t-
LDFLAGS
-debug
avec-opt:icf -dynamicbase -nxcompat -ltcg /nodefaultlib:msvcrt
Construire
zlib
à l'aide de la commande suivante (qui 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"
Copier des fichiers de votre
OpenSSL
répertoire:xcopy zlib.h C:\build\openssl\
xcopy zconf.h C:\build\openssl\
xcopy zlib.lib C:\build\openssl\
xcopy zlib.pdb C:\build\openssl\
Accédez à
OpenSSL
source:cd C:\build\openssl\
et le configurer pour une utilisation statique zlib & lire les fichiers de configuration (openssl.cnf
) à partir deC:\Windows\
répertoire.perl Configure VC-WIN64A no-shared zlib no-zlib-dynamic threads --prefix=C:\Windows\
Maintenant, faire les modifications suivantes à la
C:\build\openssl\makefile
:CFLAG
/Zc:wchar_t- /GL /Zi
LDFLAGS
/debug
avec/incremental:no /opt:icf /dynamicbase /nxcompat /ltcg /nodefaultlib:msvcrt
EX_LIBS
ZLIB1
aveczlib.lib
Construire
OpenSSL
par l'émission de lanmake
de commande (environ 15 minutes).L'résultant ~3 MO
openssl.exe
fichier sera situé àC:\build\openssl\apps\
répertoire. Il est entièrement portable, puisque toutes les Dll sont inclus. Si vous devez utiliser le fichier de configuration personnalisé, copiezC:\build\openssl\apps\openssl.cnf
à votreC:\Windows\
annuaire & de le modifier à votre convenance.OriginalL'auteur Anubioz
Il semble OpenSSL maintenant des liens avec
-MT -Zl
(au moins lors de l'utilisation de msvc) signifiant qu'il ignore par défaut nommé bibliothèques qui sont ensuite décidé de finale de votre binaire. Les Applications s'affichent à l'utilisation de la statique d'exécution par défaut.En d'autres termes, aucune des mesures doivent être prises afin de l'utiliser avec votre binaire, il suffit de fournir quel que soit le pavillon que vous voulez et de la bibliothèque OpenSSL va juste travailler avec elle. Malheureux, il n'y a pas beaucoup de béton de la documentation sur la construction d'une bibliothèque importante.
OriginalL'auteur computerquip