Windows10でmatplotlib-cppを使用した際にビルドエラーが発生したので、その時に行った対応方法について掲載します。

使用したソフトウェア

・Visual Studio 2019
・CMake 3.18.0
・Python 3.6.8(バージョン3.7以降も使用可)
・matplotlib-cpp(2021/2/15時点)

matplotlib-cppのインストール

matplotlib-cpp関連ソフトウェアのインストール方法は、技術情報「【Windows10】matplotlib-cppのインストール方法」を参照してください。
https://rtc-fukushima.jp/technical/5385/

“WinBuild.cmd”を実行するとビルドエラーが発生

“WinBuild.cmd”をダブルクリックで実行すると、実行ウィンドウが閉じてしまいビルド結果の確認を行えないので、コマンドプロンプトから以下の手順で“WinBuild.cmd”を実行します。
※ ”>”より右側に記載されているコマンドを入力してください。

cd C:¥local¥matplotlib-cpp¥contrib
WinBuild.cmd

実行すると以下のエラーが発生します。このエラーは、“WinBuild.cmd”がVisual Studio 2019に未対応だったことが原因でエラーとなっています。Visual Studio 2019では、レジストリキーなどからインストールフォルダパスを取得できないため、Visual Studio 2019のバッチファイルパスの設定を追加する必要があります。

【エラー内容】

指定されたパスが見つかりません。
CMake Error: Could not create named generator -DPYTHONPATH:STRING=C:/Users/ユーザ名/AppData/Local/Programs/Python/Python36

Generators
* Visual Studio 16 2019         = Generates Visual Studio 2019 project files.
              Use -A option to specify architecture.
 Visual Studio 15 2017 [arch] = Generates Visual Studio 2019 project files.
                 Use -A option to specify architecture.
******************************  以下省略  ******************************

【対応方法】
C:¥local¥matplotlib-cpp¥contribWinBuild.cmdをテキストエディターで開き、赤字で記載されている箇所を追加・修正します。

REM -------Set Your Environment-------------------------------
if NOT DEFINED MSVC_VERSION set MSVC_VERSION=16
if NOT DEFINED CMAKE_CONFIG set CMAKE_CONFIG=Release
if NOT DEFINED PYTHONHOME set PYTHONHOME=C:/Users/%username%/AppData/Local/Programs/Python/Python36
REM ---------------------------------------------------------------

***************************** 以下省略 *****************************

) else if "%MSVC_VERSION%"=="15" (
 if "%processor_architecture%" == "AMD64" (
  set CMAKE_GENERATOR=Visual Studio 15 2017 Win64
 ) else (
  set CMAKE_GENERATOR=Visual Studio 15 2017
 )
) else if "%MSVC_VERSION%"=="16" (
  set CMAKE_GENERATOR=Visual Studio 16 2019
)

if "%MSVC_VERSION%"=="15" (
 for /F “usebackq tokens=1.2.*" %%A in (`REG QUERY %KEY_NAME% /v %VALUE_NAME%`) do (
  set batch_file=%%CVC¥Auxiliary¥Build¥vcvarsall.bat
 )
) else if "%MSVC_VERSION%"=="16" (
  set batch_file="%ProgramFiles(x86)%¥Microsoft Visual Studio¥2019¥Community¥VC¥Auxiliary¥Build¥vcvarsall.bat"
) else (
  set batch_file=!VS%MSVC_VERSION%0COMNTOOLS!..¥..¥VC¥vcvarsall.bat
)

“WinBuild.cmd”を実行するとmatplotlibcpp.hでビルドエラーが発生

1、インクルードエラー
【エラー内容】
以下エラーは、”stod”関数が使われているのに、<>をインクルードしていないことが原因でエラーになっています。

Error C2039: ‘stod’: ‘std’のメンバーではありません。

【対応方法】
“C:¥local¥matplotlib-cpp”の”matplotlibcpp.h”にインクルード文を追加します。

# include <string>

※ 2021/3/26にGitHubに修正版がアップされています。
 
2、明示的な特殊化の重複エラー
【エラー内容】
以下エラーは、”select_npy_type<uint64_t>”、” select_npy_type<unsigned long long>”が重複して定義されているのが原因でエラーとなっています。

error: C2766: 明示的な特殊化
‘matplotlibcpp::detail::select_npy_type<uint64_t>’は既に定義されています。

【対応方法】
以下の行をコメントアウトします。

// static_assert(sizeof(long long) == 8);
// template <> struct select_npy_type<long long> { const static NPY_TYPES type = NPY_INT64; };
// static_assert(sizeof(unsigned long long) == 8);
// template <> struct select_npy_type<unsigned long long> { const static NPY_TYPES type = NPY_UINT64; };

3、コンパイルフラグ設定エラー
【エラー内容】
以下エラーは、C++17からの新機能である入れ子名前空間を使用しているのに、”CMakeLists.txt”でコンパイラフラグ”std:c++17”を設定していないのが原因でエラーとなっています。

error C2429: 言語機能’簡易静的アラート’にはコンパイラフラグ’std:c++17’が必要です。

【対応方法】
”C:¥local¥matplotlib-cpp¥contrib¥CMakeLists.txt”にコンパイラフラグ”/std:c++17”を追加します。

set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_FLAGS "/std:c++17")

4、例外処理機構の設定によるワーニング
【ワーニング内容】
C++例外処理を使用しているのに、例外処理機構を使用しない設定となっているのが原因でワーニングとなっています。

Warning C4530: C++ 例外処理を使っていますが、アンワインド セマンティクスは有効にはなりません。/EHscを指定してください。

【対応方法】

set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_FLAGS "/std:c++17 /EHsc")

matplotlib-cppのサンプルプログラムの実行

エラーを全て修正したら、再度”WinBuild.cmd”を実行します。
“C:¥local¥matplotlib-cpp¥examples¥build¥Release”フォルダに実行ファイルが生成されているので、ダブルクリックして実行してみましょう。


 
いかがでしたでしょうか。
matplotlib-cppをVisual Studio 2019で使用している情報が少なかったので、皆様の参考になればとコラムを掲載しました。
今後も様々な技術情報を掲載していきたいと思います。