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?
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:
- Download Casablanca SDK from https://github.com/Microsoft/cpprestsdk. (via GIT Clone or Zip).
- Open the VS solution and right-click on the properties of the cpprestsdk140.static.
- 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)
- In Librarian -> General -> Additional dependencies, add crypt32.lib;winhttp.lib; (See https://github.com/Microsoft/cpprestsdk/issues/344)
- 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:
- If you have previously used the Nuget version of CPPREST, firstly ensure you remove any references in the Nuget package manager.
- 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.
- Now go to C++ -> Preprocessor definitions, add _NO_ASYNCRTIMP (See https://github.com/Microsoft/cpprestsdk/issues/124).
- 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.
- Build your project and hopefully all is well ;)
I hope this helps someone (I'm sure it will)!
One more addition to the Simple Guy's answer:
If you use http_listener
class in your project it is likely you will need Httpapi.lib
to fix linker errors.
And also I want to propose an easier way to compile a static cpprestdk library.
I've successfully used it to build my project in VS2017.
- install vcpkg from https://github.com/Microsoft/vcpkg
Compile cpprestsdk using following commands:
Step 1. vcpkg install cpprestsdk:x86-windows-static
Step 2. vcpkg install cpprestsdk:x64-windows-static
Follow the second part of Simple Guy's answer starting from your project settings. Additionally, use my advice from above and BobC to fix linker errors.
Enjoy!
In addition to what Simple Guy said, you will probably need to add bcrypt.lib to the Linker->Input->Additional Dependencies since the OAuth1.obj file in CPPRest depends on some of those functions.