質問: zinnia(機械学習ベースのポータブルなオンライン手書き文字認識エンジン)を使ったスタンドアローンのアプリケーション(windows10で動作させたい)を作りたいと思っています。 cygwinをインストール後、zinniaパッケージをインストールし、pythonで動作確認はできたのですが、それをpyinstallerでexe化する所で 「ImportError:No module named _zinnia During handling of the above exception, another exception occurred:」 と出力されて困ってしまいました。 分からないことだらけなのですが助けていただければと思います。 環境 windows10 cygwin python2.7.18 pyinstaller3.6 追記 ちなみにc++では動かすこともできていません。g++ example.cpp -Lllibzinnia でコンパイルしようとすると「undefined reference to '_imp_ZN6zinnia10Recognizer6createEV'」などとerrorが出力されます(collect2.exe:error:ld returned 1 exit status)。 こちらも手助けいただけると幸いです。 追記2 visual studio2019でzinniaのdollを使ってビルドすることに成功はしたのですが、出力結果が文字化け?して難しい漢字ばかりが出力されます。問題の切り分けが自分では難しく困っています。どのような原因が考えられるでしょうか。 (cygwinにてcygwin i686-pc-cygwin-gccをインストールしてexample.cをコンパイルすることに成功しました!しかし同様にしてcygwin i686-pc-cygwin-g++でexample.copはコンパイルできません。なぜなのでしょう。。。)
回答: 押していただいたことを含めてなんとかなったので解決に至った方法を記載します(無理やり自己流?でなんとかした部分もあります) まず環境ですが、visual studio2019 で行いました。以下覚書を含めて。 新規プロジェクトを空のプロジェクトから作成 →ソリューションエクスプローラーでプロジェクト名を右クリックして追加、新しい項目でmain.cppファイルを作成(下記のmain.cppの中身をコピー) →同様にヘッダファイルもzinnia.hの内容をコピーして作成→プロジェクトフォルダにbinとlibというディレクトリを作成 →binにはlibzinnia.dllをlibにはlibzinnia.libを入れておく →ソリューションエクスプローラーでプロジェクト名を右クリックしてプロパティ▶構成プロパティの全般に出力ディレクトリがあるので$(SolutionDir)bin\と入力(.dllをbinに入れたので)▶リンカ―の全般に追加のライブラリディレクトリがあるので$(SolutionDir)lib\と入力(.libをlibに入れたので) →▶リンカ―の入力に追加の依存ファイルがあるのでlibzinnia.libと入力 →最後にmain.cppやzinnia.hがあるディレクトリにモデルファイルを置く これでなんとか動きました。出力された結果が自分の欲しい結果と一致しているか確かめるために resulut-value(i)をstringに変換し確かめたい文字列もu8でUTF-8に変換?して一致しているかを確かめることに成功しました。もっとスマートな方法があると思われますが。いったん解決とさせていただきます。ご協力ありがとうございました。jbpb0さんには大変感謝しております。どうもありがとうございました。 //main.cpp include ================== include "zinnia.h" ================== using namespace std; int main(int argc, char** argv) { SetConsoleOutputCP(CP_UTF8); //コンソールをUTF-8出力に→これでデバッグコンソールにUTF-8で出力できた zinnia::Recognizer* recognizer = zinnia::Recognizer::create(); if (!recognizer->open("handwriting-ja.model")) { cerr << recognizer->what() << endl; return -1; } zinnia::Character* character = zinnia::Character::create(); character->clear(); character->set_width(300); character->set_height(300); character->add(0, 51, 29); character->add(0, 117, 41); character->add(1, 99, 65); character->add(1, 219, 77); character->add(2, 27, 131); character->add(2, 261, 131); character->add(3, 129, 17); character->add(3, 57, 203); character->add(4, 111, 71); character->add(4, 219, 173); character->add(5, 81, 161); character->add(5, 93, 281); character->add(6, 99, 167); character->add(6, 207, 167); character->add(6, 189, 245); character->add(7, 99, 227); character->add(7, 189, 227); character->add(8, 111, 257); character->add(8, 189, 245); zinnia::Result* result = recognizer->classify(*character, 10); if (!result) { cerr << recognizer->what() << endl; return -1; } for (size_t i = 0; i < result->size(); ++i) { cout << result->value(i) << "\t" << result->score(i) << endl; if (string(result->value(i)) == u8"春") { cout << "***************" << endl; } //一致を確かめるテスト } cout << u8"確認" << endl; delete result; delete character; delete recognizer; return 0; }