CubeIDEでBoostを使う

C++には、constexprやTemplateといった、強力なコンパイル時処理の仕組みがあります。

これを活用することで実行時には超高速で処理することができるようになったりしますが、いちいち自分で作っていくのも大変なので、今回はBoostライブラリを活用する方法を紹介致します。

以下環境です。
CubeIDEに加えて、arm-none-eabi-gccのインストールされている環境が必須です。

OS
Windows10

IDE
STM32CubeIDE
Version: 1.0.0
Build: 2872_20190423-2022 (UTC)

Boost
Version1.72.0
https://www.boost.org/users/download/

arm-none-eabi-gcc
Ver8.2.0

①ダウンロード+コンパイル

Boostの公式ページ(https://www.boost.org/users/download/)から、ダウンロードしてきて、展開します。(展開後に、Boost1_72_0というフォルダが作られていると思います。)

次に、
Boost1_72_0/user-config.jam
というファイルを作り以下を記述します。

# user-config.jam file
# Arm Cortex M
using gcc : 8.2.0 : arm-none-eabi-g++.exe ;

ここで、コマンドプロンプトを起動して、
>arm-none-eabi-g++ –version
が正しくバージョンを返す事を確認してください。
もし、何も反応が無いようでしたら、環境変数でarm-none-eabi-gccのpathが通っていないと思います。arm-none-eabi-gccのインストール作業を見直してください。

次に、Boost1_72_0 内にコマンドプロンプトを立ち上げます。
私の場合は、次のようになっています。

E:\Boost\boost_1_72_0>

ここで、次のようにコマンドを入力すると、コンパイルが行われます。

E:\Boost\boost_1_72_0>b2 --toolset=gcc-8.2.0 --prefix=./ArmM link=static install

バージョン等は適宜読み替えてください。

②CubeIDEに導入

コンパイルが終了すると、boost_1_72_0/ArmM というフォルダが生成されます。
ここにライブラリの本体が入っています。

本当はCubeIDEにライブラリのリンクを設定するべきですが、今回は簡単のために、全部プロジェクトファイル内にコピーして進めていきます。

まずは、使いたいプロジェクト(今回は「STM32H743ZI_BOOST」としました。)内に、Boostというフォルダを作成します。
プロジェクト名(右クリック)>New>Folderなどから簡単に作れると思います。

次にプロジェクト設定を操作します。
プロジェクト名(右クリック)>Properties>C/C++ Build>Settings>Tool Settings>MCU G++ Compiler>Include paths
からインクルードパスを設定できます。

ここに、
../Boost
を追加します。画像は既に追加済みです。

最後に、Boostの本体をコピーしてきます。
先程作った、プロジェクト内のBoostフォルダをエクスプローラで開いて、
\ArmM\include\boost-1_72\boost

\STM32CubeIDE\workspace_1.0.0\STM32H743ZI_BOOST\Boost
内にコピーします。
Boostの中にboostがあり、紛らわしい状況ですが注意してください。

以上で、Boostの導入は終了です、お疲れさまでした。
確認のため、

#include <boost/version.hpp>

void func() {
    int i = BOOST_VERSION;
}

のようなソースを、コンパイルしてみると良いと思います。
コンパイルに成功したら、導入が成功しています。

Boostは主にアプリケーション向けのライブラリとして幅広く使われておりますが、組み込みでも活躍できると思います。
別ページに書こうと思いますが、Sprintfの置き換えとして、Boost::spirit::karmaを使うことで、3倍?程度早くなることは確認しています。

代償としてコンパイル時間がboostされますが…
今後コンパイル時間を短縮する工夫を書いていければと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です