STM32 + makefileでC++に対応してみる

2020年2月27日

STM32マイコンのペリフェラル関連記事を一覧にまとめました。

こんにちは。そらです。

STM32でROSSerialを対応させたときに、makefileでC++に対応させることをしました。そのときに、少しはまったこともあったので忘備録として書いていきます。

この対応方法でHAL,LLAPIを問わずにC++に対応が可能です。




対応させていく

変更点について

基本的には、gccでコンパイルしているところをg++に変更してC++のコンパイルをできるようにしていけばOKです。STM32CUBEMXで出力されるソースコードはC++でコンパイルすることを考えられているようで、マクロでg++でコンパイルするときにc言語としてコンパイルするようにされています。したがって、gccでcファイルをコンパイルしてg++でcppファイルをコンパイルしてg++でリンクするという方法でも、g++ですべてをコンパイルするという方法をとっても大丈夫そうだということがわかります。

makefileを改造する上では後者のほうが簡単なのでg++ですべてをコンパイルするということをしていきたいと思います。

makefileを書き換える

binariesのところを以下のように変更します

変更点についてのところで書いた通り、gccをg++にそのまま変更しました。

続いて、sourceのところにcppのソースを追加していきます

c++のときのコンパイルのflag設定などをしていきます。compile gcc flagsにc++用のフラグを立てたり、includeのパス設定を行います。

次に、build the applicationでcpp objectの追加を行いましょう。

これで、コンパイルが通ると思いきや、newlib周りのシステムコールがないと怒られてしまいコンパイルができませんでした。

対策として、libnosysというnewlibに同梱されているリンカオプションを設定することで問題がでないようにします。このリンク設定をするにあたって、LDFLAGSとLIBに-lnosysと–specs=nosys.specsを追加しましょう。

私の環境でのLDFLAGS周りを以下に示しておきます。

ここで、–specs=nosys.specsは、syscalls.cで定義されている関数と同じ関数を中でライブラリとして持っているため、syscalls.cがある場合はmultiple definitionのエラーがでる可能性があります。その場合は、syscalls.cを消してあげればOKです。

さいごに

STM32のmakefileの環境でC++にで対応してみました。ROSSerialの対応はstm32_rosserialのGitHubのREADMEを読みながら、ところどころmakefileに変更して上手くやればできると思います。よきマイコン生活を!