8

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

我提到了这个线程,但它似乎相当过时(并且链接断开):

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

我尝试从 GitHub 下载 Casablanca 存储库并编译生成 lib 文件的“cpprestsdk140.static”项目。问题是在将它与我的项目链接时,我得到了一些未解决的外部问题。

许多人评论了上述 URL 中未解决的链接错误。Github 上也有很多帖子,有人说他们无法将简单的项目与静态库链接。

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

4

3 回答 3

12

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

  1. 从https://github.com/Microsoft/cpprestsdk下载 Casablanca SDK 。(通过 GIT 克隆或 Zip)。
  2. 打开 VS 解决方案并右键单击cpprestsdk140.static的属性。
  3. C++ -> Preprocessor definitions中,添加CPPREST_EXCLUDE_COMPRESSION。完整列表如下所示:_NO_ASYNCRTIMP;_ASYNCRT_EXPORT;_PPLX_EXPORT;WIN32;_MBCS;_USRDLL;CPPREST_EXCLUDE_COMPRESSION;%(PreprocessorDefinitions)
  4. Librarian -> General -> Additional dependencies中,添加crypt32.lib;winhttp.lib; (见https://github.com/Microsoft/cpprestsdk/issues/344
  5. 按 OK,然后构建cpprestsdk140.static项目。您最终将在Binaries目录中获得一个libcpprest140d_2_9.lib(用于调试构建) 。

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

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

我希望这可以帮助某人(我相信它会)!

于 2017-07-04T16:07:52.700 回答
7

Simple Guy 的回答又多了一个补充:如果您http_listener在项目中使用类,则可能需要Httpapi.lib修复链接器错误。

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

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

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

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

  3. 从您的项目设置开始,遵循 Simple Guy 答案的第二部分。此外,使用我上面的建议和 BobC 来修复链接器错误。

享受!

于 2017-09-22T09:19:52.283 回答
5

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

于 2017-08-06T06:35:02.233 回答