2013-08-28 15 views
9

Sto lavorando a un'applicazione C++ per Windows che utilizza la libreria OpenSSL 1.0.1e. Sono su Visual Studio 2008.Come posso creare OpenSSL collegato staticamente al runtime di Windows?

Per motivi di trasferibilità la mia applicazione è collegata staticamente alle librerie di runtime (opzioni /MT e /MTd). E non invio le librerie di runtime con la mia applicazione.

Per la OpenSSL FAQ, la libreria è di default collegata al runtime DLL multithread (/MDd) che è ovviamente incompatibile con il mio scenario. Quindi per far funzionare il mio programma ho aggiunto applink.c al mio progetto. Sulla mia macchina di sviluppo e sulla maggior parte dei computer di test il programma funziona correttamente.

Ma sfortunatamente ho individuato computer in cui l'app non viene avviata. Di Windows Errore di display:

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

Ho aperto libeay32.dll in Dependency Walker e vedo che MSVCR90.dll non si trova. Quindi il trucco con applink.c non funziona davvero per me.

Come si crea OpenSSL con l'opzione /MT o /MTd?

+0

* "Ma sfortunatamente ho individuato computer in cui l'app non si avvia ... Vedo che MSVCR90.dll non è stato trovato" * - assicurarsi che i computer con problemi abbiano la versione corretta del runtime MSVC. Puoi scaricarli dal sito di Microsoft. Dovrebbero essere inclusi nel programma di installazione del pacchetto. – jww

risposta

6

Utilizzare il makefile nt.mak anziché il make-up ntdll.mak.

Come parte, ho scritto alcuni script attorno agli script di build OpenSSL standard che rendono "più facile" (almeno per me) utilizzare OpenSSL su Windows con un mix di entrambi x86 e x64, è possibile ottenerli da here.

+0

Sì, l'ho trovato. Grazie mille. – user2724991

+0

Aiuto, come faccio a compilare per/MTd? –

+0

In "Install.w32" nella distribuzione OpenSSL c'è questa nota: " Ci sono varie modifiche che è possibile apportare all'ambiente di compilazione Win32. Per impostazione predefinita la libreria non è compilata con simboli di debug Se si aggiunge" debug "a mk1mf le righe .pl nel file batch do_ *, quindi i simboli di debugging verranno compilati. Nota che mk1mf.pl si aspetta che la piattaforma sia l'ultimo argomento sulla riga di comando, quindi "debug" deve apparire prima, come tutte le altre opzioni. " ... Oppure usa nt-dbg.mak –

1

Se volete librerie OpenSSL precompilate con MT un'occhiata qui: http://www.npcglib.org/~stathis/blog/precompiled-openssl/ troverete una patch per le fonti di OpenSSL che consente la produzione di librerie con suffissi MT/MD e "D" per il debug di fare identificare le librerie più facile.

Inoltre, troverai anche lo script di compilazione vero e proprio per crearli tutti insieme per molte versioni diverse di Visual Studio. Li costruisco e li uso personalmente per produrre esattamente i binari che non hanno bisogno di DLL per i miei progetti e potresti trovarli utili.

+0

Nota: "Tutte le librerie create staticamente si collegano agli Static Runtime (/ MT invece di/MD)." Quindi, se stai cercando di costruire librerie statiche compilate con/MD [d], continua a cercare, anche se ho trovato utile vedere come le patch hanno modificato i file di build. – tekHedd

+0

Questo non ha nulla a che fare con OpenSSL, ma se si mescolano i collegamenti con statici (/ MT) e dinamici (/ MD) C si procede verso alcuni crash piuttosto brutti che saranno molto difficili da eseguire. Forse puoi mostrarci come hai mescolato i due e quali sono i risultati. Nel frattempo: "Quindi se stai cercando di costruire librerie statiche compilate con/MD [d]" ... per favore non farlo. siate coerenti e risparmiatevi il disturbo; soprattutto con il vecchio MSVC. – sigma

+0

Ho bisogno di openssl come librerie statiche compilate con/MD [d], dato che sto costruendo una DLL collegata staticamente per vari motivi che hanno molto a che fare con i clienti e nulla a che fare con la R & S più divertente. Credimi, se ci fosse un'altra opzione, l'avrei presa. Sii grato di non averne mai avuto bisogno. – tekHedd

3

L'opzione più elegante che ho trovato per Windows coinvolge usando gli script forniti a http://p-nand-q.com/programming/windows/building_openssl_with_visual_studio_2013.html

Essi forniscono script per VS2010/VS2013/VS2015 per ogni versione dello script costruisce tutte le combinazioni di x86/x86-64 con tempi di esecuzione MDd/MD/MTd/MT.

citando le istruzioni:

PREREQUISITES:

The script assumes you are on Windows.

The script assumes you have Visual Studio 2010, 2013 or 2015 installed in all the usual places. Important: If you have a different installation folder, your mileage may vary

The script assumes you have downloaded an OpenSSL tarball, like this one.

The script assumes you have Python (2.7 or 3.x) installed and on your PATH

The script assumes you have 7-zip installed (doesn't need to be on your PATH) Choose the script you want to use and edit it. For example, let's take a look at the top of 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"

so it is pretty easy to see: you must enter the OpenSSL version manually, the rest should have sensible defaults...

Note: The script uses the SUBST T:\ drive for building OpenSSL.

ho provato e funziona, in meno di 10 minuti! KUDOS per gli autori degli script !!

AGGIORNAMENTO: per generare i build x64 è necessario installare nasm assembler e averlo nel PERCORSO.

0

Costruire a 64 bit OpenSSL staticamente legata (che si traduce in un singolo file .exe senza DLL) con Visual Studio 2015, è necessario disporre dei seguenti prerequisiti:

Si prevede di installare tutti gli strumenti in tutto il sistema e di aggiungerli alla variabile ambientale %PATH%.

Dopo aver ottenuto tutto quello che serve, basta seguire questi semplici passi:

  1. Aprire VS2015 x64 Strumenti Native Command Prompt dal menu Start. Verrà visualizzato il prompt dei comandi.
  2. Creare C:\build directory e emettere il seguente comando nel prompt dei comandi:

    • cd c:\build
  3. Scarica l'ultima codici sorgente zlib & OpenSSL per il tuo build dir utilizzando i seguenti comandi:

    • git clone https://github.com/madler/zlib
    • git clone https://github.com/openssl/openssl
  4. Prima dobbiamo costruire statica zlib.Per fare questo prima si devono modificare alcuni file di configurazione:

    • Passare alla cartella zlib fonte: cd C:\build\zlib
    • Modificare il file win32\Makefile.msc:

      1. Trova la riga che inizia con CFLAGS
      2. Sostituisci -MD con -GL -MT -Zc:wchar_t-
      3. Trova la riga che inizia con LDFLAGS
      4. Sostituire -debug con -opt:icf -dynamicbase -nxcompat -ltcg /nodefaultlib:msvcrt
  5. Corporatura zlib utilizzando il seguente comando (dovrebbe prendere meno di un minuto):

      file
    • nmake -f win32/Makefile.msc AS=ml64 LOC="-DASMV -DASMINF -DNDEBUG -I." OBJA="inffasx64.obj gvmat64.obj inffas8664.obj"
  6. copia risultante al tuo.530.010.628,12321 milioni directory:

    • 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. Spostarsi OpenSSL fonte: cd C:\build\openssl\ e configurarlo per utilizzare i file di configurazione di lettura zlib & statici (openssl.cnf) da 012.324 Directory.

    • perl Configure VC-WIN64A no-shared zlib no-zlib-dynamic threads --prefix=C:\Windows\
  8. Ora apportare le seguenti modifiche al C:\build\openssl\makefile:

    • Trovare la riga che inizia con: CFLAG
    • Aggiungi: /Zc:wchar_t- /GL /Zi
    • Trovare la linea che inizia con: LDFLAGS
    • Sostituire /debug con /incremental:no /opt:icf /dynamicbase /nxcompat /ltcg /nodefaultlib:msvcrt
    • Trovare la riga che inizia con: EX_LIBS
    • Sostituire ZLIB1 con zlib.lib
    • Salva modifiche
  9. Corporatura OpenSSL con il comando nmake (avrà circa 15 minuti).

Il risultante file ~ 3MB openssl.exe sarà situato a C:\build\openssl\apps\ directory. È completamente portatile, dal momento che tutte le DLL sono incluse. Se è necessario utilizzare un file di configurazione personalizzato, copiarenella directory C:\Windows\ & modificarlo a proprio piacimento.

+0

la domanda diceva collegamento contro il runtime statico di windows non compilare il codice staticamente c'è una differenza –

Problemi correlati