non vorrei lavorare

昔はおもにプログラミングやガジェット系、今は?

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相当の指定はどうするんだっけ

stackoverflow.com

/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ファイルを実行するも以下のようなエラーダイアログが表示され、 実行できない。

f:id:kjw_junichi:20180325131410p:plain

解決方法を探る

github.com

のREADMEを読んでも、VS2017ならライブラリを追加するだけで、必要なことは他になくて、簡単にV8を組み込めるよ。と 記述しかなく、困った。

仕方ないので、VS2017を立ち上げて、プロジェクトを作って動かしてみたら、 なんとなくわかった。

作成したexeファイルと同じ階層にdll等が置かれていた。 真似して、コマンドラインで作業して作成したexeと同じディレクトリにdllやら.datファイルを コピーした。

copy v8.redist-v141-x64.6.4.388.11\lib\Release\*.* .

これで、動かうようになった。

f:id:kjw_junichi:20180325131207p:plain

関連記事

13年前の記事

4年前の記事

Raspberry Pi3でTensorflowをビルドして動かした

こんばんは。相変わらず、長男は部屋の片付けが出来るものの、次男が台無しにするという事態が続いていますが、久しぶりに自宅で休日をのんびりと過ごせた@kjunichiです。

背景

Raspberry Pi3でTensorflowをビルド

公式のGithubのドキュメントではgccの版が指定されてましたが、随分古い版で、 実際試していた際は、gccの内部エラーを連発されてStretch付属のgccでビルドしました。

github.com

github.com

メモリが足りない?!

壊れかけのSSDの120GBが余っていたので、これをスワップに割り当てて メモリを大幅に増やしてビルド。

ビルド時は何らかの冷却が必要?!

メモリを増やしたところ、本体がフリーズすることは少なくなったものの、 今度は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/Makefilensync.aを追加することで、リンクエラーを回避できた。

- -lz
+ -lz ./tensorflow/contrib/makefile/downloads/nsync/builds/default.linux.c++11/nsync.a

動いた

関連記事

Tensorflowつながり

Raspberry Piつながり

1年後の記事

2018年春版Raspberry Pi 3の3.5mmジャックからAlexaを出した

こんばんは、長男が回復したと思ったら、今度は次男がまたまた発熱で実家に次男と二人出来ている@kjunichiです。

背景

2017年末ごろから、サンプルアプリが、JavaからC++実装のモノに切り替わっていたりして、 軽くググると出てくる情報とは異なる今日この頃。

github.com

音声入力

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 Piつながり

14年前の記事

13年前の記事

9年前の記事

4年前の記事