🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

CMake

CMakeはクロスプラットフォームで作動するオープンソースのビルドシステムです。コマンドライン又は組み込まれた開発環境で使うことができる元のmakefileとプロジェクトファイルを生成します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

3719閲覧

C++でmatplotlibcppを使いたいがエラーがでる。

hidekiti

総合スコア23

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

CMake

CMakeはクロスプラットフォームで作動するオープンソースのビルドシステムです。コマンドライン又は組み込まれた開発環境で使うことができる元のmakefileとプロジェクトファイルを生成します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/12/25 15:29

編集2020/12/26 04:10

#環境

  • os: WIndows 10 Pro
  • Shell: PowerShell
  • python interpriter: Python3.8 PATH:C:/AppData/msys2/mingw64/bin/python.exe
  • c++ compiler:msys2の上でのmingw64 PATH:C:/AppData/msys2/mingw64/bin/g++.exe
  • make : GNU Make 4.3
  • cmake : version 3.19.1

#問題
Main.ccをCMakeFileListsにのっとってMakeFileを作ってmakeでコンパイルすると、
コンパイルには成功するが、実行時に以下のエラーが出る。
Main.ccでインクルードしてる、matplotlibcppってヘッダーファイルの中でPython.hや、numpyのAPIなどを使っている。

ERROR

1Could not find platform independent libraries <prefix> 2Could not find platform dependent libraries <exec_prefix> 3Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>] 4Python path configuration: 5 PYTHONHOME = (not set) 6 PYTHONPATH = (not set) 7 program name = 'plotting' 8 isolated = 0 9 environment = 1 10 user site = 1 11 import site = 1 12 sys._base_executable = 'C:\Users\hideki\Documents\LatexWorkspace\math-tech-experiment-7\source\kadai1\build\Main.exe' 13 sys.base_prefix = 'D:\a\_temp\msys\msys64\mingw64' 14 sys.base_exec_prefix = 'D:\a\_temp\msys\msys64\mingw64' 15 sys.executable = 'C:\Users\hideki\Documents\LatexWorkspace\math-tech-experiment-7\source\kadai1\build\Main.exe' 16 sys.prefix = 'D:\a\_temp\msys\msys64\mingw64' 17 sys.path = [ 18 'D:\a\_temp\msys\msys64\mingw64\lib\python38.zip', 19 'D:\a\_temp\msys\msys64\mingw64\lib\python3.8', 20 'D:\a\_temp\msys\msys64\mingw64\lib\python3.8', 21 'D:\a\_temp\msys\msys64\mingw64\lib\lib-dynload', 22 ] 23Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding 24Python runtime state: core initialized 25ModuleNotFoundError: No module named 'encodings' 26 27Current thread 0x0000035c (most recent call first): 28<no Python frame>

c++

1 2#include<stdio.h> 3#include<stdlib.h> 4#include<math.h> 5#include<vector> 6#include<iostream> 7 8#include"matplotlibcpp.h" 9 10#define rep(i, n) for (int i = 0; i < (int)(n); i++) 11#define rep1(i, n) for (int i = 1; i <= (int)(n); i++) 12 13using namespace std; 14namespace plt=matplotlibcpp; 15 16int main(){ 17 cout<<"ahoahoaho"<<endl; 18 19 plt::plot({1,2,4,8,16}); 20 plt::show(); 21}

CMakeLists

1cmake_minimum_required(VERSION 3.14) 2project(Main) 3 4set(CMAKE_CXX_STANDARD 11) 5 6add_executable(Main a-res.cc) 7 8# matplotlibcppで使うPythonとNumpyを探す 9find_package(Python3 COMPONENTS Development NumPy) 10target_include_directories(Main PRIVATE ${Python3_INCLUDE_DIRS} ${Python3_NumPy_INCLUDE_DIRS}) 11target_link_libraries(Main Python3::Python Python3::NumPy)

#いろいろな情報
必要であれば開示します。解決したいのでなんでも助言してください。

  • PYTHONHOMEについてはWIndowsのシステム環境変数で定義したが変わらない。。

  • CMakeCache.txt の中ではPythonのライブラリへのパスや、pythonのインタプリタへのパス、NumpyのAPIへのパス等々正確な値がとれているのを確認した。

`make --debug=v'での結果は以下です。省略しましたが、numpyのAPIなどの存在を全部確認しているようです。

debug

1GNU Make 4.3 2このプログラムは x86_64-pc-msys 用にビルドされました 3Copyright (C) 1988-2020 Free Software Foundation, Inc. 4ライセンス GPLv3+: GNU GPL バージョン 3 以降 <http://gnu.org/licenses/gpl.html> 5これはフリーソフトウェアです: 自由に変更および配布できます. 6法律の許す限り、 無保証 です. 7makefile を読み込みます... 8makefile 'Makefile' の読み込み中... 9makefile の更新中.... 10最終ターゲットを更新中.... 11ファイル 'default_target' を検討しています. 12 ファイル 'default_target' が存在しません. 13 ファイル 'all' を検討しています. 14 ファイル 'all' が存在しません. 15 ファイル 'cmake_check_build_system' を検討しています. 16 ファイル 'cmake_check_build_system' が存在しません. 17 ターゲットファイル 'cmake_check_build_system' の必要条件を満たしました. 18 ターゲット 'cmake_check_build_system' を再make する必要があります. 19 ターゲットファイル 'cmake_check_build_system' の再 make に成功しました. 20 ターゲットファイル 'all' の必要条件を満たしました. 21 ターゲット 'all' を再make する必要があります. 22GNU Make 4.3 23このプログラムは x86_64-pc-msys 用にビルドされました 24Copyright (C) 1988-2020 Free Software Foundation, Inc. 25ライセンス GPLv3+: GNU GPL バージョン 3 以降 <http://gnu.org/licenses/gpl.html> 26これはフリーソフトウェアです: 自由に変更および配布できます. 27法律の許す限り、 無保証 です. 28makefile を読み込みます... 29makefile 'CMakeFiles/Makefile2' の読み込み中... 30makefile の更新中.... 31最終ターゲットを更新中.... 32ファイル 'all' を検討しています. 33 ファイル 'all' が存在しません. 34 ファイル 'CMakeFiles/Main.dir/all' を検討しています. 35 ファイル 'CMakeFiles/Main.dir/all' が存在しません. 36 ターゲットファイル 'CMakeFiles/Main.dir/all' の必要条件を満たしました. 37 ターゲット 'CMakeFiles/Main.dir/all' を再make する必要があります. 38GNU Make 4.3 39このプログラムは x86_64-pc-msys 用にビルドされました 40Copyright (C) 1988-2020 Free Software Foundation, Inc. 41ライセンス GPLv3+: GNU GPL バージョン 3 以降 <http://gnu.org/licenses/gpl.html> 42これはフリーソフトウェアです: 自由に変更および配布できます. 43法律の許す限り、 無保証 です. 44makefile を読み込みます... 45makefile 'CMakeFiles/Main.dir/build.make' の読み込み中... 46makefile 'CMakeFiles/Main.dir/depend.make' の読み込み中 (探索パス) (~ の展開なし)... 47makefile 'CMakeFiles/Main.dir/progress.make' の読み込み中 (探索パス) (~ の展開なし)... 48makefile 'CMakeFiles/Main.dir/flags.make' の読み込み中 (探索パス) (~ の展開なし)... 49makefile の更新中.... 50最終ターゲットを更新中.... 51ファイル 'CMakeFiles/Main.dir/depend' を検討しています. 52 ファイル 'CMakeFiles/Main.dir/depend' が存在しません. 53 ターゲットファイル 'CMakeFiles/Main.dir/depend' の必要条件を満たしました. 54ターゲット 'CMakeFiles/Main.dir/depend' を再make する必要があります. 55ターゲットファイル 'CMakeFiles/Main.dir/depend' の再 make に成功しました. 56GNU Make 4.3 57このプログラムは x86_64-pc-msys 用にビルドされました 58Copyright (C) 1988-2020 Free Software Foundation, Inc. 59ライセンス GPLv3+: GNU GPL バージョン 3 以降 <http://gnu.org/licenses/gpl.html> 60これはフリーソフトウェアです: 自由に変更および配布できます. 61法律の許す限り、 無保証 です. 62makefile を読み込みます... 63makefile 'CMakeFiles/Main.dir/build.make' の読み込み中... 64makefile 'CMakeFiles/Main.dir/depend.make' の読み込み中 (探索パス) (~ の展開なし)... 65makefile 'CMakeFiles/Main.dir/progress.make' の読み込み中 (探索パス) (~ の展開なし)... 66makefile 'CMakeFiles/Main.dir/flags.make' の読み込み中 (探索パス) (~ の展開なし)... 67makefile の更新中.... 68最終ターゲットを更新中.... 69ファイル 'CMakeFiles/Main.dir/build' を検討しています. 70 ファイル 'CMakeFiles/Main.dir/build' が存在しません. 71 ファイル 'Main.exe' を検討しています. 72 ファイル 'Main.exe' が存在しません. 73 ファイル 'C:/AppData/msys2/mingw64/lib/libpython3.8.dll.a' を検討しています. 74 ターゲットファイル 'C:/AppData/msys2/mingw64/lib/libpython3.8.dll.a' の必要条件を満たしました. 75 ターゲット 'C:/AppData/msys2/mingw64/lib/libpython3.8.dll.a' を再make する必要はありません. 76 ファイル 'CMakeFiles/Main.dir/a-res.cc.obj' を検討しています. 77 ファイル '../a-res.cc' を検討しています. 78 ターゲットファイル '../a-res.cc' の必要条件を満たしました. 79 ターゲット '../a-res.cc' を再make する必要はありません. 80 ファイル 'C:/AppData/msys2/mingw64/include/python3.8/Python.h' を検討しています. 81 ターゲットファイル 'C:/AppData/msys2/mingw64/include/python3.8/Python.h' の必要条件を満たしました. 82 ターゲット 'C:/AppData/msys2/mingw64/include/python3.8/Python.h' を再make する必要はありません. 83 。。。(省略)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2020/12/25 23:55

make VERBOSE=1 でコンパイル過程が表示されるので、下記の必要な情報が全て不足無くコンパイラのオプションに指定されてるか、調べてみたらいかがでしょうか > CMakeCache.txt の中ではPythonのライブラリへのパスや、pythonのインタプリタへのパス、NumpyのAPIへのパス等々正確な値がとれているのを確認した。
jbpb0

2020/12/26 00:01

確認ですが、 > MakeFileを作ってコンパイルすると、 以下のエラーが出る。 とは、cmake の実行はエラー無くできて、その次の make の実行でエラーが出る、という意味ですよね?
jbpb0

2020/12/26 00:57

エラー読むと、 D:\\a\\_temp\\msys\\msys64\\mingw64 があちこちにありますよね そこにもpythonが入ってませんか? 下記とは別に > python interpriter: Python3.8 PATH:C:/AppData/msys2/mingw64/bin/python.exe
jbpb0

2020/12/26 01:10

> PYTHONHOMEについてはWIndowsのシステム環境変数で定義したが変わらない。 https://bugs.python.org/issue27054 によると、PYTHONHOMEやPYTHONPATHを設定することも、そのエラーが発生する原因となるようです 上記ページの一番下では、空で設定するか、設定を削除することが勧められています(設定の意味を十分に理解してる場合以外は)
hidekiti

2020/12/26 03:57

makeはできます。実行時にエラーが出ます。。
hidekiti

2020/12/26 03:59

私のパソコンにDドライブはないはずなんです。だから、そのパスもおかしいなって思ってるんです。
hidekiti

2020/12/26 04:06

PYTHONHOMEはけしました。pythonの標準ライブラリへのパスだと認識してました。
hidekiti

2020/12/26 04:09

POwershellで表示されていたパスを入力しても、そのようなストレージに移動することはできませんでした。
jbpb0

2020/12/26 06:14 編集

実行時のエラーなんですね コンパイルができてるなら、コンパイラに必要な情報は、ちゃんと指定されてるのでしょう make のメッセージでは c:/AppData/msys2/mingw64/lib/libpython3.8.dll.a が使われてるっぽいのに、実行時のエラーに D:... がたくさんあるのは、謎ですね ところで、そのpythonは、普通に起動したらエラー出さずに使えるのですよね?
hidekiti

2020/12/26 08:50

pythonをPowershellで起動すると普通に使えます。。。
jbpb0

2020/12/26 09:45 編集

msys2 環境は手元にないのですが、TDM-GCC は入れてるので、それ用に cd build cmake .. -G "MinGW Makefiles" make してできた .exe を動かしたら、同じエラーが出ました Fatal Python error: initfsencoding: unable to load the file system codec ModuleNotFoundError: No module named 'encodings' 対策を探して、下記を見つけました https://teratail.com/questions/125904 (まだ試してません) 【追記】書かれているように https://www.python.org/downloads/windows/ から、今使ってるpythonのバージョンと同じバージョンの「Windows x86-64 embeddable zip file」を落として build フォルダに展開し、.exe を動かしたら、別のエラーが出ました ModuleNotFoundError: No module named 'numpy' ModuleNotFoundError: No module named 'matplotlib' terminate called after throwing an instance of 'std::runtime_error' what(): Error loading module matplotlib!
jbpb0

2020/12/26 10:17 編集

動きました やったことは、「PYTHONHOMEを設定」することです (削除した方がいいと言っておきながら。。。) https://teratail.com/questions/125904 を読んで、インストールしたpython関連のDLLが全て見つかればエラーが出なくなるだろうと思い、設定してみたら、うまくいきました 質問者さんとはインストールした状態がだいぶ異なるので、質問者さんの環境でもうまくいくか分かりませんが、試してみてください (msys2 環境のpythonやg++を使える状態の)コマンドプロンプトで、下記を続けて実行します set PYTHONHOME=適切なフォルダ Main.exe PYTHONHOME に設定するフォルダは、たぶん「C:/AppData/msys2/mingw64」あたりだろうと思いますが、msys2 環境でpythonを使ったことが無いので、よく分かりません あと、将来pythonを別の場所に入れ直したり、複数のpythonをインストールして使い分けたり、仮想環境を作って使ったりする際に、PYTHONHOME を設定しているとトラブルの元になるので、ご注意ください (日数が経つと、設定したこと自体を忘れがち) 【追記】https://www.python.org/downloads/windows/ から落とした「embeddable zip file」を展開したファイルは、削除したので使ってません
jbpb0

2020/12/26 10:27

> コマンドプロンプトで、下記を続けて実行します > set PYTHONHOME=適切なフォルダ > Main.exe PowerShellだと、こうですかね $env:PYTHONHOME=適切なフォルダ Main.exe
hidekiti

2020/12/26 11:03

できました!!!! ありがとうございます!!! ほんと再現までしてくださって感謝感激です!!
hidekiti

2020/12/26 11:07

ここで設定した環境変数はWIndowsのGUIから設定できるシステム環境変数やユーザー環境変数とは違うものなのでしょうか? Shell固有のものでしょうか?
jbpb0

2020/12/27 07:47 編集

同じものですが、PowerShellで $env:PYTHONHOME=... で設定しても、他へは影響しません Windowsの設定で環境変数に設定した場合は、設定したタイミングよりも後にPowerShellを起動したら反映されてるはずです $env:PYTHONHOME を実行したら、表示されるはず 【追記】上記はちょっと不正確な書き方をしてしまいました PowerShellは、Windowsとは別の環境変数を持ってますが、起動時にWindowsの環境変数をコピーするので、起動時はWindowsの設定にある環境変数と基本同じです 起動後に $env:PYTHONHOME=... で設定したものは、そのPowerShellの環境変数に追加されますが、Windowsの環境変数には追加されません 他のPowerShellの環境変数にも追加されません
hidekiti

2020/12/27 13:29

丁寧にありがとうございます。 解決したので解答として投稿していただければ、ベストアンサーにしたいと思います。 もしそれが面倒であれば、jbpb0さんの名前を載せて私が解決法を投稿してもよいですがどうしましょう??
guest

回答1

0

ベストアンサー

msys2 環境は手元にないのですが、TDM-GCC は入れてるので、それ用に
cd build
cmake .. -G "MinGW Makefiles"
make
してできた .exe を動かしたら、同じエラーが出ました

対策を探して、下記を見つけました
C++ から Python 実行について
それを読んで、インストールしたpython関連のDLLが全て見つかればエラーが出なくなるだろうと思い、「環境変数PYTHONHOME」を設定してみたら、動きました

質問者さんとはインストールした状態がだいぶ異なるので、質問者さんの環境でもうまくいくか分かりませんが、試してみてください
(msys2 環境のpythonやg++を使える状態の)コマンドプロンプトで、下記を続けて実行します
set PYTHONHOME=適切なフォルダ
Main.exe
PowerShellだと、こうですかね
$env:PYTHONHOME=適切なフォルダ
Main.exe

PYTHONHOME に設定するフォルダは、たぶん「C:/AppData/msys2/mingw64」あたりだろうと思いますが、msys2 環境でpythonを使ったことが無いので、よく分かりません

あと、将来pythonを別の場所に入れ直したり、複数のpythonをインストールして使い分けたり、仮想環境を作って使ったりする際に、PYTHONHOME を設定しているとトラブルの元になるので、ご注意ください
(日数が経つと、設定したこと自体を忘れがち)

投稿2020/12/31 06:09

jbpb0

総合スコア7653

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問