備忘録

備忘録

cpprestsdk をビルドしてstatic linkする

Ⅰ. はじめに

cpprestsdk の使い方はこちら

cpprestsdk はNuGetで dynamic link 版が配布されています。
static link 版は配布されていません。

static link する為には2017/10/08時点、自分でビルドするしか方法がありません。

Ⅱ. 必要なもの

  • VisualStudio 2015

※VisualStudio 2017でも可能ですが、v140のプラットフォームツールセットのインストールが必須です。
※v140プラットフォームツールセットインストール方法

Ⅲ. スタティックライブラリ(.lib)のビルド方法

1. cloneする
git clone https://github.com/Microsoft/cpprestsdk
2. cpprestsdk140.sln を開く

以下のダイアログが出てもUWP, Android対応等必要無ければスキップする。

3. cpprestsdk140.static プロジェクトのプロパティを開く
  • 「構成プロパティ」→「C/C++」→「コード生成」→「ランタイムライブラリ」

マルチスレッド(/MT)に変更

4. 構成マネージャを開き、Releaseを選択する

プラットフォームは任意の物を選択して下さい。

5. cpprestsdk140.static プロジェクトだけを右クリックしてビルドを実行する
6. スタティックライブラリ(.lib)が作成されます

f:id:kagasu:20171008013836p:plain

Ⅳ. 作成したスタティックライブラリ(.lib)を使用する方法

1. プロジェクトのプロパティを開く
  • 「構成プロパティ」→「全般」→「プラットフォームツールセット」

Visual Studio 2015 (v140)」を選択

「cpprestsdk/Release/include」を追加

「cpprestsdk/Binaries/x64/Release」を追加

  • 「構成プロパティ」→「C/C++」→「コード生成」→「ランタイムライブラリ」

マルチスレッド(/MT)に変更

_NO_ASYNCRTIMP」を追加

2. NuGetからzlibをインストールする

このパッケージはパッケージのオーナーが非公開設定している為、検索しても出てきません。
以下のコマンドを実行する必要があります。

Install-Package zlib.v140.windesktop.msvcstl.static.rt-dyn -Version 1.2.8.8
3. サンプルコード
#include <Windows.h>
#include <iostream>
#pragma comment(lib, "crypt32.lib")
#pragma comment(lib, "bcrypt.lib")
#pragma comment(lib, "winhttp.lib")
#pragma comment(lib, "libcpprest140_2_9.lib")
#include <cpprest/http_client.h>

using namespace web;
using namespace web::http;
using namespace web::http::client;

pplx::task<void> Get()
{
  return pplx::create_task([]
  {
    http_client client(L"https://jsonplaceholder.typicode.com/posts/1");
    return client.request(methods::GET);
  }).then([](http_response response)
  {
    if (response.status_code() == status_codes::OK)
    {
      // レスポンスを文字列として取得後、標準出力する
      // auto body = response.extract_string();
      // std::wcout << body.get().c_str() << std::endl;

      // レスポンスをJSONとして解析する
      return response.extract_json();
    }
  }).then([](json::value json)
  {
    // タイトルだけを取得する
    std::wcout << json[L"title"].as_string() << std::endl;
  });
}

int main()
{
  // コマンドプロンプトの文字コードをUTF-8に設定する
  SetConsoleOutputCP(CP_UTF8);

  try
  {
    Get().wait();
  }
  catch (const std::exception &e)
  {
    std::cout << "Error = " << e.what() << std::endl;
  }

  return 0;
}
3. 実行結果

f:id:kagasu:20171007190436p:plain