7

I am having a hard time trying to add openssl to my project. I have downloaded the precompiled installer for windows, and I have the libraries installed, but I can't find a way to include openssl in my project.

Note: I am using Visual Studio Expres 2012 on Windows 7 x64, but it's not restricted to that environment.

3 Answers 3

23

Intro



Let's assume you have installed OpenSSL in a dir like: "C:\Program Files\Openssl-Win32-1.0.1p....." (or whatever other name); I am going to refer to that as OPENSSL_INSTALL_DIR (as it was an Nix style env var). So, ${OPENSSL_INSTALL_DIR} should contain a bunch of dirs and files, out of which matter for us:

  • Dirs:

    • include

    • lib

  • Files (since their names vary across versions, I'm going to refer to them using (again, Nix style var) placeholders; also they might be located in a bin subdir):

    1. ${LIBCRYPTO}.dll

    2. ${LIBSSL}.dll


    where LIBCRYPTO (#1.) and LIBSSL (#2.) are defined as follows:

    • v1.0.2 and older

      1. libeay32

      2. ssleay32 (might be also copied (or symlinked) to libssl32)

    • v1.1.*

      1. libcrypto-1_*(-x64)

      2. libssl-1_*(-x64)

    • v3.*

      1. libcrypto-3*(-x64)

      2. libssl-3*(-x64)

As a side note, on Nix, the 2 files (.dlls - shared objects) are typically named libcrypto.so.* and libssl.so.* (where suffix is a version indicator).

In order to make use of OpenSSL installation, in your VStudio project you have to (check [SO]: LNK2005 Error in CLR Windows Form (@CristiFati's answer) for more details on the rationale (the why part)):

1. Configure the compiler ([MS.Learn]: Compiler Options Listed Alphabetically)

Instruct it:

  • Where to search for include (header (.h)) files. Go to your "Project Properties -> C/C++ -> General -> Additional Include Directories" and adding ${OPENSSL_INSTALL_DIR}\include (if you need to add other paths, separate them by a semicolon (;)). Now you can include in your source code OpenSSL header files.
    Note that because "${OPENSSL_INSTALL_DIR}\include" dir contains an openssl subdir and under that subdir are the actual header files, your #include clauses would have to look like this:

    #include <openssl/ssl.h>
    

    Of course you could add ${OPENSSL_INSTALL_DIR}\include\openssl dir to your project, and then the above include statement would be:

    #include <ssl.h>
    

    but the former is preferred (recommended)

2. Configure the linker ([MS.Learn]: Linker Options)

Instruct it:

  • Where to search for libraries. You can do that by going to your "Project Properties -> Linker -> General -> Additional Library Directories" and adding ${OPENSSL_INSTALL_DIR}\lib (again, if there are multiple paths, separate them by ;)

  • What libraries to use. "${OPENSSL_INSTALL_DIR}\lib" dir contains a bunch of .lib files. Out of those, you will (most likely) only need ${LIBCRYPTO}.lib and / or ${LIBSSL}.lib. Go to your "Project Properties -> Linker -> Input -> Additional Dependencies" and add those 2 libraries next to the existing ones

3. Build and run

Now, if all your settings and source code are correct, you should have a "buildable" project. When you'll want to run your project output (either an .exe or a .dll needed by another executable), the executable will need to find the 2 .dlls that I mentioned at the beginning (if you linked with the _static versions (check #1), this doesn't apply (isn't required)). For that, you should either:

  1. Add their dir to your PATH env var (I consider this the cleanest one). Example:

    • From console (before launching the executable):

      set PATH=%PATH%;${OPENSSL_INSTALL_DIR}
      
    • For the running VStudio instance:

      Img0

  2. Copy them in the folder where your executable is located ([MS.Learn]: Dynamic-Link Library Search Order)

  3. Copy them in one of the dirs from your %PATH%.
    Some installers might copy the 2 .dlls in your "%SystemRoot%\System32" dir, and in that case this will no longer be necessary (I find this practice of copying stuff in system dirs a bad one, as in our current example multiple versions can ship the same file names, and the last one installed would overwrite all the others)

Important note: Must be careful when targeting your project for 032bit or 064bit (setting Platform to Win32 or x64 in VStudio IDE) - that has to match your OpenSSL installation architecture (check [SO]: Python Ctypes - loading dll throws OSError: [WinError 193] %1 is not a valid Win32 application (@CristiFati's answer) for (funky) errors that occur if it doesn't).

Worth mentioning that .dll search mechanism also applies when the .dll is dynamically loaded (via [MS.Learn]: LoadLibraryExW function (libloaderapi.h) functions family), as explained in the above URL. There are also other ways (but those include hardocding paths: [MS.Learn]: AddDllDirectory function (libloaderapi.h)). Although in a more complex scenario, [SO]: Can't import dll module in Python (@CristiFati's answer) covers them.

Sign up to request clarification or add additional context in comments.

1 Comment

Fantastic Answer. VS2019...but more so these little hidden settings I dont explore often are nice to learn bout
10

A lot has changed since this question was originally asked. Since then vcpkg has come along and has made installing external libraries a lot easier.

To install and use vcpkg, use the following:

git clone  https://github.com/Microsoft/vcpkg
cd vcpkg
bootstrap-vcpkg.bat
vcpkg integrate install

The last command is for optional, but recommended User-wide integration.

Then to install OpenSsl, try the following:

vcpkg search ssl
vcpkg install openssl-windows --triplet x64-windows

Your options may vary depending on the platform specifics.

Restart Visual Studio and you should be ready to go.

Tested with Visual Studio Community 2019.

References:

vcpkg

vcpkg Quick Start

Comments

1

Use Conan. It is very simple to install and use:

www.conan.io

You can request the files ready for use. For example for Linux x64 or usage with Visual Studio 2012... Here a sample instruction:

conan install OpenSSL/1.0.2g@lasote/stable -s arch="x86_64" -s build_type="Debug" -s compiler="gcc" -s compiler.version="5.3" -s os="Linux" -o 386="False" -o no_asm="False" -o no_rsa="False" -o no_cast="False" -o no_hmac="False" -o no_sse2="False" -o no_zlib="False" ...

2 Comments

use vcpkg its like yum for centos vcpkg install openssl-windows
(2 commands you need to run in this order) vcpkg integrate install vcpkg install openssl-windows first command auto installs packages into the proper locations of your VC2017/VC2019

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.