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で使う方法は公式に記載されていないが、以下の手順で導入完了。
- vcpkgでcpprestsdk:x64-windows-static及びcpprestsdk:x64-windows-staticを必要に応じて実行。
- vcpkgでintegrate installを実行。
- Visual Studioのプロジェクトのプロパティにvcpkgというアイテムが出来ているので、そこのuse static librariesを「はい」にする。
これで無事にメモリ関連のエラーも起きなくなり解決。