2013-08-28 6 views
9

Ich arbeite an einer C++ - Anwendung für Windows, die OpenSSL 1.0.1e-Bibliothek verwendet. Ich bin auf Visual Studio 2008.Wie baue ich OpenSSL statisch mit der Windows-Laufzeitumgebung verbunden?

Aus Gründen der Portabilität ist meine Anwendung statisch mit Laufzeitbibliotheken verknüpft (/MT und /MTd Optionen). Und ich liefere keine Laufzeitbibliotheken mit meiner Anwendung.

Per der OpenSSL FAQ ist die Bibliothek standardmäßig gegen Multithread DLL-Laufzeit (/MDd) verknüpft, die offensichtlich mit meinem Szenario nicht kompatibel ist. Damit mein Programm funktioniert, habe ich applink.c zu meinem Projekt hinzugefügt. Auf meiner Entwicklungsmaschine und auf den meisten Testcomputern funktioniert das Programm gut.

Aber leider habe ich Computer gefunden, wo die App nicht startet. Windows zeigt Fehler:

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

Ich habe libeay32.dll in Dependency Walker geöffnet und ich sehe, dass MSVCR90.dll nicht gefunden wird. Also funktioniert der Trick mit applink.c nicht wirklich für mich.

Wie baue ich OpenSSL mit /MT oder /MTd Option?

+0

* "Aber leider habe ich Computer gefunden, wo die App nicht startet ... Ich sehe, dass MSVCR90.dll nicht gefunden wird" * - sicher sein, dass die Problemcomputer die richtige Version der MSVC-Laufzeit haben. Sie können sie von der Microsoft-Website herunterladen. Sie sollten in Ihrem Paketinstallationsprogramm enthalten sein. – jww

Antwort

6

Verwenden Sie das Makefile nt.mak anstatt das Makefile ntdll.mak.

Nebenbei habe ich einige Skripte rund um die Standard-OpenSSL-Build-Skripte geschrieben, die es (zumindest für mich) einfacher machen, OpenSSL unter Windows mit einer Mischung aus x86 und x64 zu verwenden here.

+0

Yup, fand es. Vielen Dank. – user2724991

+0

Hilfe, wie kompiliere ich für/MTd? –

+0

In "Install.w32" in der OpenSSL-Distribution gibt es diesen Hinweis: " Es gibt verschiedene Änderungen, die Sie an der Win32-Kompilierumgebung vornehmen können. Standardmäßig ist die Bibliothek nicht mit Debugging-Symbolen kompiliert. Wenn Sie" debug "zum mk1mf hinzufügen .pl-Zeilen in der Batchdatei do_ * werden dann Debugging-Symbole kompiliert. Beachten Sie, dass mk1mf.pl erwartet, dass die Plattform das letzte Argument in der Befehlszeile ist. Daher muss 'debug' wie alle anderen Optionen davor erscheinen. " ... Oder benutze nt-dbg.mak –

1

Wenn Sie vorkompilierte OpenSSL-Bibliotheken mit MT wollen hier: http://www.npcglib.org/~stathis/blog/precompiled-openssl/ Sie einen Patch für die OpenSSL Quellen finden, die Bibliotheken mit Suffixen MT/MD und „d“ für Debug einfacher, die Bibliotheken zu identifizieren machen ermöglicht die Herstellung.

Darüber hinaus finden Sie auch das eigentliche Build-Skript, um alle gleichzeitig für viele verschiedene Versionen von Visual Studio zu erstellen. Ich baue und benutze sie selbst, um genau Binaries zu erzeugen, die keine DLLs für meine Projekte benötigen und Sie könnten sie nützlich finden.

+0

Hinweis: "Alle statisch aufgebauten Bibliotheken verknüpfen sich mit den statischen Laufzeiten (/ MT anstelle von/MD)." Wenn Sie also versuchen, statische Bibliotheken zu erstellen, die mit/MD [d] kompiliert wurden, schauen Sie weiter, obwohl ich es nützlich fand zu sehen, wie die Patches die Build-Dateien verändert haben. – tekHedd

+0

Das hat nichts mit OpenSSL zu tun, aber wenn man statische (/ MT) und dynamische (/ MD) C-Laufzeiten miteinander verbindet, geht es in Richtung ziemlich hässlicher Abstürze, die sehr schwer zu debuggen sind. Vielleicht kannst du uns zeigen, wie du die zwei gemischt hast und was die Ergebnisse sind. In der Zwischenzeit: "Wenn Sie also statische Bibliotheken erstellen möchten, die mit/MD [d] kompiliert wurden ... tun Sie das bitte nicht. sei einfach konsequent und rette dir den Ärger; vor allem mit alten MSVC. – sigma

+0

Ich brauche openssl als statische libs kompiliert mit/MD [d], da ich eine statisch verknüpfte DLL aus verschiedenen Gründen aufbaue, die viel mit Kunden zu tun haben und nichts damit zu tun haben, R & D mehr Spaß zu machen. Glauben Sie mir, wenn es eine andere Option gäbe, hätte ich es genommen. Sei dankbar, dass du es nie nötig hast. – tekHedd

3

Die eleganteste Option, die ich für Windows gefunden haben, beinhaltet die Skripte in http://p-nand-q.com/programming/windows/building_openssl_with_visual_studio_2013.html

Sie bieten Skripte zur Verfügung gestellt mit für VS2010/VS2013/VS2015 für jede Skriptversion baut es alle Kombinationen von x86/x86-64 mit Runtimes MDd/MD/MTd/MT.

Zitiert die Anweisungen:

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.

I getestet und es funktioniert, in weniger als 10 Minuten! KUDOS für die Autoren der Drehbücher !!

UPDATE: Für die x64-Builds, die generiert werden, müssen Sie NASM Assembler installieren und im PATH haben.

0

64-Bit-OpenSSL statisch gelinkt zu bauen (die ohne DLLs in einer einzigen EXE-Datei führt) mit Visual Studio 2015 die folgenden Voraussetzungen müssen:

Ihnen erwartet, dass alle diese Werkzeuge systemweit installieren und fügen Sie sie in Ihre %PATH% Umgebungsvariable.

Nachdem Sie alles haben wir benötigen, folgen Sie einfach diesen einfachen Schritten:

  1. öffnen VS2015 x64 native Tools-Eingabeaufforderung aus dem Startmenü. Sie werden die Eingabeaufforderung sehen.
  2. erstellen C:\build Verzeichnis und geben Sie den folgenden Befehl in der Eingabeaufforderung:

    • cd c:\build
  3. Herunterladen neueste zlib & OpenSSL Quellcodes zu Ihrem build dir durch die folgenden Befehle:

    • git clone https://github.com/madler/zlib
    • git clone https://github.com/openssl/openssl
  4. Zuerst müssen wir zlib statisch bauen.Um das zu tun zuerst müssen wir einige Konfigurationsdateien bearbeiten:

    • Navigieren Sie zu dem zlib Quellordner: cd C:\build\zlib
    • Bearbeiten Sie die win32\Makefile.msc Datei:

      1. die Linie finden, beginnend mit CFLAGS
      2. Ersetzen Sie -MD durch -GL -MT -Zc:wchar_t-
      3. Finden Sie die Zeile beginnend mit LDFLAGS
      4. ersetzen -debug mit -opt:icf -dynamicbase -nxcompat -ltcg /nodefaultlib:msvcrt
  5. Build-zlib mit dem folgenden Befehl (sollte weniger als eine Minute dauern):

    • nmake -f win32/Makefile.msc AS=ml64 LOC="-DASMV -DASMINF -DNDEBUG -I." OBJA="inffasx64.obj gvmat64.obj inffas8664.obj"
  6. Kopieren resultierenden Dateien zu deiner OpenSSL Verzeichnis:

    • 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. Navigieren Sie zu OpenSSL Quelle: cd C:\build\openssl\ und konfigurieren Sie statische zlib & Lesekonfigurationsdateien zu verwenden (openssl.cnf) aus C:\Windows\ Verzeichnis.

    • perl Configure VC-WIN64A no-shared zlib no-zlib-dynamic threads --prefix=C:\Windows\
  8. nun folgende Änderungen vornehmen, um die C:\build\openssl\makefile:

    • die Zeile finden, die mit Beginn des Einsatzes: CFLAG
    • anhängen: /Zc:wchar_t- /GL /Zi
    • die Zeile finden, die beginnt mit: LDFLAGS
    • ersetzen /debug mit /incremental:no /opt:icf /dynamicbase /nxcompat /ltcg /nodefaultlib:msvcrt
    • die Zeile finden, die mit Beginn des Einsatzes: EX_LIBS
    • ersetzen ZLIB1 mit zlib.lib
    • Änderungen speichern
  9. Build-OpenSSL durch den nmake Befehl ausgibt (dauert etwa 15 Minuten).

Die resultierende ~ 3MB openssl.exe Datei wird bei C:\build\openssl\apps\ Verzeichnis befinden. Es ist vollständig portabel, da alle DLLs enthalten sind. Wenn Sie eine benutzerdefinierte Konfigurationsdatei verwenden müssen, kopieren Sie C:\build\openssl\apps\openssl.cnf in Ihr C:\Windows\ Verzeichnis & bearbeiten Sie es nach Ihren Wünschen.

+0

die Frage sagte Link gegen statische Windows-Laufzeit nicht kompilieren Code statisch gibt es einen Unterschied –

Verwandte Themen