静态链接Casablanca/CPPREST SDK

Sim*_*Guy 7 visual-c++ cpprest-sdk

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

我已经提到过这个帖子,但它似乎过时了(并且链接断了):

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

我试图从GitHub下载Casablanca repo并编译产生lib文件的"cpprestsdk140.static"项目.问题是当我将它与我的项目链接时,我得到了许多未解决的外部因素.

许多人评论了上述URL中未解决的链接错误.Github上还有许多线程,人们说他们无法将简单项目与静态库链接起来.

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

Sim*_*Guy 10

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

  1. https://github.com/Microsoft/cpprestsdk下载Casablanca SDK .(通过GIT Clone或Zip).
  2. 打开VS解决方案,右键单击cpprestsdk140.static的属性.
  3. C++ - > 预处理器定义中,添加CPPREST_EXCLUDE_COMPRESSION.完整列表如下所示:_NO_ASYNCRTIMP; _ASYNCRT_EXPORT; _PPLX_EXPORT; WIN32; _MBCS; _USRDLL; CPPREST_EXCLUDE_COMPRESSION;%(预处理器定义)
  4. Librarian - > General - > Additional dependencies中,添加crypt32.lib; winhttp.lib; (见https://github.com/Microsoft/cpprestsdk/issues/344)
  5. 按确定,然后生成cpprestsdk140.static项目.您将在Binaries目录中找到libcpprest140d_2_9.lib(用于Debug构建).

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

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

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


小智 6

Simple Guy的答案还有一个补充:如果在项目中使用http_listener类,很可能需要Httpapi.lib来修复链接器错误.

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

  1. https://github.com/Microsoft/vcpkg安装vcpkg
  2. 使用以下命令编译cpprestsdk:vcpkg install cpprestsdk:x86-windows-static vcpkg install cpprestsdk:x64-windows-static
  3. 从项目设置开始,遵循Simple Guy的第二部分答案.另外使用我上面的建议和BobC修复链接器错误.

请享用!


小智 5

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