Statically linking Casablanca/CPPREST SDK

Simple Guy picture Simple Guy · Jul 4, 2017 · Viewed 7.1k times · Source

I am trying to create a Windows-based VC++ DLL (in VS 2015) that statically links to the Casablanca CPPREST SDK. That is, I would like a single DLL output which contains the CPP REST library along with my code.

I have referred to this thread, however it seems rather dated (and has broken links):

https://katyscode.wordpress.com/2014/04/01/how-to-statically-link-the-c-rest-sdk-casablanca/

I have tried to download the Casablanca repo from GitHub and compile the "cpprestsdk140.static" project which produces a lib file. The problem is I get a number of unresolved externals when linking it with my project.

Numerous people have commented on the unresolved link errors in the above-mentioned URL. There are also numerous threads on Github with people saying they cannot link simple projects with the static library.

Does anyone have a clear set of steps that can help resolve this?

Answer

Simple Guy picture Simple Guy · Jul 4, 2017

OK, I pooled together a number of suggestions from the various threads and have the following set of steps in order to successfully link to the CPP REST static library:

  1. Download Casablanca SDK from https://github.com/Microsoft/cpprestsdk. (via GIT Clone or Zip).
  2. Open the VS solution and right-click on the properties of the cpprestsdk140.static.
  3. In the C++ -> Preprocessor definitions, add CPPREST_EXCLUDE_COMPRESSION. The full list looks like: _NO_ASYNCRTIMP;_ASYNCRT_EXPORT;_PPLX_EXPORT;WIN32;_MBCS;_USRDLL;CPPREST_EXCLUDE_COMPRESSION;%(PreprocessorDefinitions)
  4. In Librarian -> General -> Additional dependencies, add crypt32.lib;winhttp.lib; (See https://github.com/Microsoft/cpprestsdk/issues/344)
  5. Press OK, then build the cpprestsdk140.static project. You will end up with a libcpprest140d_2_9.lib (for Debug build) in the Binaries directory.

Now, in your own project:

  1. If you have previously used the Nuget version of CPPREST, firstly ensure you remove any references in the Nuget package manager.
  2. Right-click your project properties and go to C++ -> Additional Include Directories and enter the path for the CPPREST SDK include files. They currently reside in cpprestsdk\Release\include.
  3. Now go to C++ -> Preprocessor definitions, add _NO_ASYNCRTIMP (See https://github.com/Microsoft/cpprestsdk/issues/124).
  4. Go to Linker -> Input and add libcpprest140d_2_9.lib (along with pathname, if applicable). For the release version, it appears you also need to add crypt32.lib;winhttp.lib.
  5. Build your project and hopefully all is well ;)

I hope this helps someone (I'm sure it will)!