WindowsでV8のサンプルをコマンドラインでビルドして動かす
こんにちは暖かくなると奥さんの活動が活発化して、毎週どこかに出歩くようになり、今週もその 例外にもれず、子供たちは映画を見に行ったようで、自分は留守番してます。@kjunichiです。
背景
plv8の昨年のプルリク、当時のV8だとSpectreやMeltdownの影響を受けてしまう。 そのまま放置ももったいないので、最新のコードに対応すべく、プルリクを更新しようと考えている。
今回はその第一歩として、plv8-2.3.0で採用されている版のV8をWindows環境で 動かすことを目標とした。
nugetでV8の取得
nuget.exe本体は
から取得できる。
nuget.exeをインストールして、以下を実行して、カレントディレクトリ配下に コンパイル済みのv8を取得する。
nuget install v8-v141-x64 -Version 6.4.388.11
実行すると、ヘッダと.libファイルの入ったv8-v141-x64.6.4.388.11というフォルダと dllが入ったv8.redist-v141-x64.6.4.388.11とうフォルダの2つが配下に作成される。
V8のサンプルコードの入手
linux boxでV8のビルドガイドに従い、ソースをfetch後、git checkout時にバージョンを上記の「6.4.388.11」として指定して取得する。
cl.exeで-lや-L相当の指定はどうするんだっけ
/linkの後にリンカーへのオプションを指定できる模様。
-L相当のオプションは/LIBPATH:だった。 -l相当のオプションは分からず、直接指定して対応した。
cl /EHsc hello-world.cc /Iv8-v141-x64.6.4.388.11 /I v8-v141-x64.6.4.388.11\include v8.dll.lib v8_libbase.dll.lib v8_l ibplatform.dll.lib /link /LIBPATH:v8-v141-x64.6.4.388.11\lib\Release
動かない
こうして、作成されたexeファイルを実行するも以下のようなエラーダイアログが表示され、 実行できない。
解決方法を探る
のREADMEを読んでも、VS2017ならライブラリを追加するだけで、必要なことは他になくて、簡単にV8を組み込めるよ。と 記述しかなく、困った。
仕方ないので、VS2017を立ち上げて、プロジェクトを作って動かしてみたら、 なんとなくわかった。
作成したexeファイルと同じ階層にdll等が置かれていた。 真似して、コマンドラインで作業して作成したexeと同じディレクトリにdllやら.datファイルを コピーした。
copy v8.redist-v141-x64.6.4.388.11\lib\Release\*.* .
これで、動かうようになった。
関連記事
13年前の記事
4年前の記事
Raspberry Pi3でTensorflowをビルドして動かした
こんばんは。相変わらず、長男は部屋の片付けが出来るものの、次男が台無しにするという事態が続いていますが、久しぶりに自宅で休日をのんびりと過ごせた@kjunichiです。
背景
tensorflowの公式のraspberry piのドキュメントに従った昨日からビルドを試みてるが、tensorflow本体のビルドでフリーズ?してるみたいで昨晩試しにそのまま寝たら、起きたら、sshで繋いでいたから、それが切れて、どうも中断してた模様
— kjunichi (@kjunichi) 2018年3月12日
コンパイルで、.oファイル作るだけで、殆どの処理を遅延させて、それが原因でsshを切断させてしまうみたい。本体のコンソールから試そうとしたが、流石に日中不在の部屋で熱暴走とかして、異常加熱とか怖そうなさだから、また、今晩チャレンジかな
— kjunichi (@kjunichi) 2018年3月12日
Raspberry Pi3でTensorflowをビルド
公式のGithubのドキュメントではgccの版が指定されてましたが、随分古い版で、 実際試していた際は、gccの内部エラーを連発されてStretch付属のgccでビルドしました。
メモリが足りない?!
壊れかけのSSDの120GBが余っていたので、これをスワップに割り当てて メモリを大幅に増やしてビルド。
Raspberry Pi 3 でのtensorflowのビルド、こないだSSDを128Gほどスワップに割り当てた作戦はどうもCPUの温度が高いまま続行してたのがよくなかった見たい、今朝は固まらずいい感じでドキュメント指定の版のg++だとダメだとコンパイラのバグを引く模様
— kjunichi (@kjunichi) 2018年3月16日
ビルド時は何らかの冷却が必要?!
メモリを増やしたところ、本体がフリーズすることは少なくなったものの、 今度はgccの内部エラーが頻発するようになった。
どうもRaspberry Pi3はCPUの冷却に問題がありそうな気配をググって感じつつあったので、 冷却を考えた。
最終的に本体ケースの上に保冷剤を載っけて、本体を冷やしながらビルド作業しました。
リンクエラー
pi@raspberrypi:~/local/src/tensorflow $ make -f tensorflow/contrib/pi_examples/label_image/Makefile -j2 gcc --std=c++11 -O0 -I/usr/local/include -I. -I/home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/downloads -I/home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/downloads/eigen/ -I/home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/gen/proto/ -I/home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/gen/proto_text/ \ -o /home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/gen/bin//label_image /home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/gen/obj/tensorflow/contrib/pi_examples/label_image/label_image.o \ -L/usr/local/lib -L/home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/gen/lib -Wl,--no-whole-archive -Wl,--allow-multiple-definition -Wl,--whole-archive -ltensorflow-core -Wl,--no-whole-archive -lstdc++ -lprotobuf -ldl -lpthread -lm -ljpeg -lz /home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/gen/lib/libtensorflow-core.a(mutex.o): 関数 `tensorflow::mutex::mutex()' 内: mutex.cc:(.text+0x8): `nsync::nsync_mu_init(nsync::nsync_mu_s_*)' に対する定義されていない参照です /home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/gen/lib/libtensorflow-core.a(mutex.o): 関数 `tensorflow::mutex::lock()' 内: mutex.cc:(.text+0x14): `nsync::nsync_mu_lock(nsync::nsync_mu_s_*)' に対する定義されていない参照です /home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/gen/lib/libtensorflow-core.a(mutex.o): 関数 `tensorflow::mutex::try_lock()' 内: mutex.cc:(.text+0x1c): `nsync::nsync_mu_trylock(nsync::nsync_mu_s_*)' に対する定義されていない参照です /home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/gen/lib/libtensorflow-core.a(mutex.o): 関数 `tensorflow::mutex::unlock()' 内: mutex.cc:(.text+0x2c): `nsync::nsync_mu_unlock(nsync::nsync_mu_s_*)' に対する定義されていない参照です /home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/gen/lib/libtensorflow-core.a(mutex.o): 関数 `tensorflow::mutex::lock_shared()' 内: mutex.cc:(.text+0x30): `nsync::nsync_mu_rlock(nsync::nsync_mu_s_*)' に対する定義されていない参照です /home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/gen/lib/libtensorflow-core.a(mutex.o): 関数 `tensorflow::mutex::try_lock_shared()' 内: mutex.cc:(.text+0x38): `nsync::nsync_mu_rtrylock(nsync::nsync_mu_s_*)' に対する定義されていない参照です /home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/gen/lib/libtensorflow-core.a(mutex.o): 関数 `tensorflow::mutex::unlock_shared()' 内: mutex.cc:(.text+0x48): `nsync::nsync_mu_runlock(nsync::nsync_mu_s_*)' に対する定義されていない参照です /home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/gen/lib/libtensorflow-core.a(mutex.o): 関数 `tensorflow::condition_variable::condition_variable()' 内: mutex.cc:(.text+0x54): `nsync::nsync_cv_init(nsync::nsync_cv_s_*)' に対する定義されていない参照です /home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/gen/lib/libtensorflow-core.a(mutex.o): 関数 `tensorflow::condition_variable::wait(tensorflow::mutex_lock&)' 内: mutex.cc:(.text+0x64): `nsync::nsync_cv_wait(nsync::nsync_cv_s_*, nsync::nsync_mu_s_*)' に対する定義されていない参照です /home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/gen/lib/libtensorflow-core.a(mutex.o): 関数 `tensorflow::condition_variable::wait_until_system_clock(tensorflow::mutex_lock&, std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long long, std::ratio<1ll, 1000000000ll> > >)' 内: mutex.cc:(.text+0x7c): `nsync::nsync_from_time_point_(std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long long, std::ratio<1ll, 1000000000ll> > >)' に対する定義されていない参照です mutex.cc:(.text+0x94): `nsync::nsync_cv_wait_with_deadline(nsync::nsync_cv_s_*, nsync::nsync_mu_s_*, timespec, nsync::nsync_note_s_*)' に対する定義されていない参照です /home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/gen/lib/libtensorflow-core.a(mutex.o): 関数 `tensorflow::condition_variable::notify_one()' 内: mutex.cc:(.text+0xa8): `nsync::nsync_cv_signal(nsync::nsync_cv_s_*)' に対する定義されていない参照です /home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/../../makefile/gen/lib/libtensorflow-core.a(mutex.o): 関数 `tensorflow::condition_variable::notify_all()' 内: mutex.cc:(.text+0xac): `nsync::nsync_cv_broadcast(nsync::nsync_cv_s_*)' に対する定義されていない参照です collect2: error: ld returned 1 exit status tensorflow/contrib/pi_examples/label_image/Makefile:72: ターゲット '/home/pi/local/src/tensorflow/tensorflow/contrib/pi_examples/label_image/gen/bin//label_image' のレシピで失敗しました
対応
tensorflow/contrib/pi_examples/label_image/Makefileにnsync.aを追加することで、リンクエラーを回避できた。
- -lz + -lz ./tensorflow/contrib/makefile/downloads/nsync/builds/default.linux.c++11/nsync.a
動いた
ようやくRaspberry Pi3でtensorflowをビルドしてサンプルを動かせた。stretchだとデフォルトのgccでビルド出来た。冷やさないとgccが内部エラーになり落ちるし、メモリもスワップ追加してないときつそう。 https://t.co/Y9aEtMukpM pic.twitter.com/kEK2UZAcvH
— kjunichi (@kjunichi) 2018年3月18日
関連記事
Tensorflowつながり
Raspberry Piつながり
1年後の記事
2018年春版Raspberry Pi 3の3.5mmジャックからAlexaを出した
こんばんは、長男が回復したと思ったら、今度は次男がまたまた発熱で実家に次男と二人出来ている@kjunichiです。
背景
2017年末ごろから、サンプルアプリが、JavaからC++実装のモノに切り替わっていたりして、 軽くググると出てくる情報とは異なる今日この頃。
次男にraspberry pi 3にアレクサが来るかもよ、と伝えたところ、メチャクチャ楽しみにしてしまってて、早いとこアレクサを連れてこないとなんだけど、今朝は、マイクの入力ストリームの呼び出しがタイムアウトしてるとログ出力されてる
— kjunichi (@kjunichi) 2018年3月8日
音声入力
WebCamのマイクだと駄目だった。
arecord -l
でALSAに認識されていてもAlexaから利用できなかった。
使えたマイク
以下のUSBマイクを購入した。
アレクサの声がしない
USBマイクを購入して
AbstractKeywordDetector:readFromStreamFailed:reason=readerTimeOut
のエラーが解消したが、「アレクサ」と呼んで、何か言っても、 ログ上はなんだか反応していることは分かるが、アレクサの声が全く聞こえない
もう、USBマイク購入という思わぬ出費を既にしており、お金がないから、追加投資は無理!
神ISSUE発見!
同やら、gstreamの出力先の指定が外部のUSBサウンドデバイスになっているのか、 以下の様にコードを修正することで、無事アレクサの声がスピーカーから聞こえるようになった。
MediaPlayer.cppを以下の様に修正。
-m_pipeline.audioSink = gst_element_factory_make("autoaudiosink", "audio_sink"); +m_pipeline.audioSink = gst_element_factory_make("alsasink", "audio_sink");
修正対象のソースのありか
cd ~ find . -name MediaPlayer.cpp
リビルド方法
cd ~ cd build sudo make SampleApp
後は、READMEとおり、
cd ~ sudo bash startsample.sh
まとめ
ようやく、アレクサをraspberry pi3に呼び出す事が出来、次男の期待に応えられた。マイクは、当初webカメラのc270のマイクを使おうとしたがダメ、別途600円台のUSBカメラを購入、スピーカーはAvsのMediaPlaerのソースをgithubのイシューのように書き換える事で出来た。
— kjunichi (@kjunichi) 2018年3月9日
関連記事
Raspberry Piつながり
- Raspberry Piの音を他のPCで再生する
- Raspberry Pi 3が届いた!
- Raspberry Pi3でTensorflowをビルドして動かした
- 陰関数の仮想3D空間へのプロットあるいは、ラズパイ版マインクラフトにたけのこの里を出す
- Raspberry Piの温度をgRPCを使ってElectronで作ったデスクトップマスコットに表示させた
- Juliaでゼータ関数を直接jupyterにプロットしたり、マインクラフト(MCPI)にプロットした