Building OpenSSL for Visual Studio on Windows is mostly straight-forward, but it has some quirks. I’ll document the results of my wrestling here so that future attempts will be less painful.
What you need
You need to install…
- Visual Studio 2010 (see comments for success stories with Visual Studio 2015 as well)
- ActivePerl or Strawberry Perl 1
- Latest version of OpenSSL source-code 2
Setting up for the build
Unzip3 the OpenSSL source code into two different folders, one for the 32-bit build and one for the 64-bit build4. So, for example, you might end up with C:\openssl-src-32
and C:\openssl-src-64
.
Building the 32-bit static libraries
- Open the Visual Studio Command Prompt (2010)5.
-
cd
to your OpenSSL source folder for 32-bit (e.g.cd C:\openssl-src-32
). - Run the following: 6
ms \ do_ms
nmake - f ms \ nt . mak
nmake - f ms \ nt . mak install
Your outputs will be in C:\Build-OpenSSL-VC-32
.
Building the 32-bit static libraries with debug symbols
These steps will embed the debug symbols directly into the .lib
files. Don’t expect to see any .pdb
files.
- Open the Visual Studio Command Prompt (2010).
-
cd
to your OpenSSL source folder for 32-bit (e.g.cd C:\openssl-src-32
). - Run the following:
perl Configure debug - VC - WIN32 -- prefix = C :\ Build - OpenSSL - VC - 32 - dbg
ms \ do_ms - In a text editor (like Notepad), open
ms\nt.mak
and replace all occurrences of/Zi
with/Z7
. There should be three replacements.7 - Run the following:
nmake - f ms \ nt . mak
nmake - f ms \ nt . mak install
Your outputs will be in C:\Build-OpenSSL-VC-32-dbg
. Make sure you rename them to something likelibeay32-debug.lib
and ssleay32-debug.lib
.
Building the 64-bit static libraries
- Open the Visual Studio x64 Win64 Command Prompt (2010) (in the Start menu).
-
cd
to your OpenSSL source folder for 64-bit (e.g.cd C:\openssl-src-64
). - Run the following:
perl Configure VC - WIN64A -- prefix = C :\ Build - OpenSSL - VC - 64
ms \ do_win64a
nmake - f ms \ nt . mak
nmake - f ms \ nt . mak install
Your outputs will be in C:\Build-OpenSSL-VC-64
.
Note: The outputs of the 64-bit build are still named libeay32.lib
and ssleay32.lib
. You’ll have to rename them more sensibly yourself.
Building the 64-bit static libraries with debug symbols
These steps will embed the debug symbols directly into the .lib
files. Don’t expect to see any .pdb
files.
- Open the Visual Studio x64 Win64 Command Prompt (2010).
-
cd
to your OpenSSL source folder for 64-bit (e.g.cd C:\openssl-src-64
). - Run the following:
perl Configure debug - VC - WIN64A -- prefix = C :\ Build - OpenSSL - VC - 64 - dbg
ms \ do_win64a - In a text editor (like Notepad), open
ms\nt.mak
and replace all occurrences of/Zi
with/Z7
except on the line starting withASM
. There should be two replacements. 8 - Run the following:
nmake - f ms \ nt . mak
nmake - f ms \ nt . mak install
Your outputs will be in C:\Build-OpenSSL-VC-64-dbg
. Make sure you rename them to something likelibeay64-debug.lib
and ssleay64-debug.lib
.
What not to do
I tried every method under the sun to get a Windows build of OpenSSL that would link against Visual Studio projects. I learned a great deal along the way. Here’s what I learned not to do:
- Don’t blindly follow the Windows 32-bit/64-bit installation instructions provided in the OpenSSL source folder. Get guidance online.
- Don’t build OpenSSL in Cygwin. It’s easy. It won’t link against Visual Studio.
- Don’t build OpenSSL in MSYS or MinGW. It’s hard. It won’t link against Visual Studio.
- Don’t try to use NASM like the Windows installation instructions mention. It’s not necessary for Visual Studio builds. (It only supports 32-bit anyway.)
- Strawberry Perl doesn’t always work in these weird configurations. ActivePerl seemed more stable.
- Don’t try to build 32-bit and 64-bit OpenSSL in the same folder. The first build will leave artifacts that will mess up the second build. (Running a clean isn’t enough, apparently.)
- Don’t try to build 32-bit OpenSSL inside of Visual Studio’s 64-bit command prompt and vice versa. It doesn’t work.
References
These were very helpful places:
ms\\ntdll.mak
will build the shared library instead.
/Zi
option works, but it’s hard to find the right
.pdb
file without specifying more options. For the sake of simplicity, the
/Z7
option just embeds all the debug symbols into the
.lib
files. Read more
here.
ml64.exe
) to compile assembly code. According to
MASM’s documentation, the
/Z7
option is not supported.