概要
nuttx/libxx
の中に基本的なC++の機能を提供するためのライブラリは付属していますが,STLがカバーしている iostream
や vector
等の機能を利用したプログラムは,そのままではコンパイルできません.
この記事では,軽量なSTL互換ライブラリであるuClibc++をSPRESENSEのNuttXに組み込み,C++の標準ライブラリを利用できるようにする方法を紹介します.
バージョン等
- SPRESENSE SDK v1.0.1
- NuttX: git(
33597a8
)
uClibc++のクローンとインストール
NuttXのuClibc++をsdkと同じディレクトリにクローンします.
$ git clone https://bitbucket.org/nuttx/uclibc.git
|
SPRESENSEのNuttXは本家NuttXの最新版とはディレクトリ構造が異なるため,install.sh
を編集して対応させます.
実行してファイルをインストールします.
$ cd uclibc $ ./install.sh ../nuttx
|
これによって,nuttx/include/uClibc++
の中にヘッダが,nuttx/libxx/uClibc++
の中にソースがコピーされます.
nuttx/Make.defs
を編集して,uClibc++のヘッダのあるディレクトリをインクルードパスに追加します.
パッチを当てる
最近のコンパイラではそのままビルドできないため,パッチを当てます.
参考: [PATCH 2/2 uClibc++] Fix ARM EABI build failure in include/unwind-cxx.h
NuttXカーネルの設定と再ビルド
$ cd sdk $ make menuconfigkernel
|
矢印キーで選択,Enterで下の階層に入り,Escを2回押して上の階層に戻れます.スペースでチェックを付け外します.
- Library Routines
- sizeof(_Bool) is 8-bits のチェックを入れる
- Build uClibc++ のチェックを入れる
- Enable Exception Support のチェックを外す
- Have libsupc++ のチェックを外す
ビルドします.
$ make cleankernel $ make buildkernel
|
うまく行かないときは config.py
でデフォルトの設定を読ませてから再度 make menuconfig
するとうまく行くかもしれません.
STLを使用したプログラムを書く
tools/mkappsdir.py
と tools/mkcmd.py
を使ってプロジェクトを作成します.
参考→ SPRESENSE SDKでArduinoを使わずにとりあえずLチカする
$ tools/mkappsdir.py cxxapps 'C++ Applications' $ tools/mkcmd.py -d cxxapps test_stl 'STL test'
|
テンプレートとしてコピーされるソースの拡張子を変更します.
$ cd ../cxxapps/test_stl $ mv test_stl_main.c test_stl_main.cxx
|
Makefileを編集します.コンパイラのフラグも書いておきます.
外から見えている必要のある関数(ここではtest_stl_main
)を extern "C"
で囲みます.
基本的にはこれだけしていればおkです.
あとはプログラムを書いていきます.
以下の例は,vectorに入れて出すだけの無意味なプログラムです.
ビルド
“C++ Applications” → “STL Test” にチェックを入れて終了します.
$ make $ ./tools/flash.sh -b 2000000 -c /dev/ttyUSB0 nuttx.spk
|
できた