静态链接 Casablanca/CPPREST SDK

Statically linking Casablanca/CPPREST SDK

我正在尝试创建一个基于 Windows 的 VC++ DLL(在 VS 2015 中),它静态 links 到 Casablanca CPPREST SDK。也就是说,我想要一个包含 CPP REST 库和我的代码的 DLL 输出。

我已经提到了这个线程,但是它看起来相当过时(并且已经损坏 links):

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

我尝试从 GitHub 下载 Casablanca 存储库并编译生成 lib 文件的 "cpprestsdk140.static" 项目。问题是当 link 将它与我的项目一起使用时,我得到了许多未解决的外部问题。

许多人评论了上述 URL 中未解决的 link 错误。 Github 上也有许多帖子,人们说他们不能 link 使用静态库的简单项目。

有没有人有一套清晰的步骤可以帮助解决这个问题?

好的,我汇集了来自各个线程的一些建议,为了成功 link 到 CPP REST 静态库,我有以下一组步骤:

  1. https://github.com/Microsoft/cpprestsdk 下载卡萨布兰卡 SDK。 (通过 GIT 克隆或 Zip)。
  2. 打开VS解决方案,右击cpprestsdk140.static.
  3. 的属性
  4. C++ -> 预处理器定义中,添加CPPREST_EXCLUDE_COMPRESSION。完整列表如下所示:_NO_ASYNCRTIMP;_ASYNCRT_EXPORT;_PPLX_EXPORT;WIN32;_MBCS;_USRDLL;CPPREST_EXCLUDE_COMPRESSION;%(PreprocessorDefinitions)
  5. Librarian -> General -> Additional dependencies,添加crypt32.lib;winhttp.lib;(见https://github.com/Microsoft/cpprestsdk/issues/344
  6. 按确定,然后构建 cpprestsdk140.static 项目。您将在 Binaries 目录中得到一个 libcpprest140d_2_9.lib(用于调试版本)。

现在,在你自己的项目中:

  1. 如果您以前使用过 CPPREST 的 Nuget 版本,请首先确保删除 Nuget 包管理器中的所有引用。
  2. 右键单击您的项目属性并转到 C++ -> 其他包含目录 并输入 CPPREST SDK 包含文件的路径.他们目前居住在cpprestsdk\Release\include.
  3. 现在转到 C++ -> 预处理器定义,添加 _NO_ASYNCRTIMP (参见 https://github.com/Microsoft/cpprestsdk/issues/124)。
  4. 转到 Linker -> Input 并添加 libcpprest140d_2_9.lib(以及与路径名,如果适用)。对于发布版本,您似乎还需要添加 crypt32.lib;winhttp.lib.
  5. 构建您的项目,希望一切顺利 ;)

我希望这对某人有帮助(我相信它会)!

除了 Simple Guy 所说的之外,您可能需要将 bcrypt.lib 添加到 Linker->Input->Additional Dependencies,因为 CPPRest 中的 OAuth1.obj 文件依赖于其中一些函数.

对 Simple Guy 的回答的补充: 如果您在项目中使用 http_listener class,您可能需要 Httpapi.lib 来修复链接器错误。

而且我还想提出一种更简单的方法来编译静态 cpprestdk 库。 我已经成功地使用它在 VS2017 中构建了我的项目。

  1. https://github.com/Microsoft/vcpkg
  2. 安装 vcpkg
  3. 使用以下命令编译 cpprestsdk:

    第一步。vcpkg install cpprestsdk:x86-windows-static

    第 2 步。vcpkg install cpprestsdk:x64-windows-static

  4. 从您的项目设置开始,按照 Simple Guy 回答的第二部分进行操作。此外,使用我上面的建议和 BobC 来修复链接器错误。

尽情享受吧!