ドナドナされるプログラマのメモ

Windows用アプリのプログラミングメモ

C++REST (cpprest)をスタティック構成のMFCと一緒に使う

RedmineのデータをREST API経由でダウンロードするプログラムを作るためにcpprestを導入しようとした際に苦労した点のメモ。

前記ソフトをMFCランタイムをダウンロードできない/しづらい環境でも使えるようにするため、MFCをスタティックライブラリとして組み込む必要があった。しかし、なぜか忌々しい「Debug assertion failed!」とともに、

File: minkernel\crts\ucrt\src\appcrt\heap\debug_heap.cpp

Line: 996

Expression:__acrt_first_block == header

というのが表示された。

んんん?公式ライブラリでこんな致命的なエラー?どいうことだ?

調査したところ、どうやらcpprestはメモリ確保をDLL内部で独自にやっていて、それがアプリ内部でのメモリ管理と衝突してしまっているようだ。これを解決するにはcpprestもスタティックライブラリにすればよい。cpprestをstaticで使う方法は公式に記載されていないが、以下の手順で導入完了。

  1. vcpkgでcpprestsdk:x64-windows-static及びcpprestsdk:x64-windows-staticを必要に応じて実行。
  2. vcpkgでintegrate installを実行。
  3. Visual Studioのプロジェクトのプロパティにvcpkgというアイテムが出来ているので、そこのuse static librariesを「はい」にする。

これで無事にメモリ関連のエラーも起きなくなり解決。