前提条件
ハードウェア
- multitech mDot
IDE
- Mbed Studio 1.4.4
コンパイラ
- ARM6
この記事について
Mulutitech mDotのサンプルコードがコンパイルできなかったときの解決策が載っています。
サンプルコードURL: https://os.mbed.com/teams/MultiTech/code/Dot-Examples/
エラーについて
mDotのサンプルコードをMbed Studioでコンパイルするとエラーが多発する。
エラーコード
[Warning] @0,0: L3912W: Option 'legacyalign' is deprecated.
[Warning] @0,0: L6439W: Multiply defined Global Symbol SetSysClock defined in .text.SetSysClock(BUILD/MTS_MDOT_F411RE/ARMC6/mbed-os/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F411xE/system_clock.o) rejected in favor of Symbol defined in .text.SetSysClock(BUILD/MTS_MDOT_F411RE/ARMC6/mbed-os/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F411xE/TARGET_MTS_MDOT_F411RE/system_clock.o).
[Warning] @0,0: L6439W: Multiply defined Global Symbol SetSysClock_PLL_HSE defined in .text.SetSysClock_PLL_HSE(BUILD/MTS_MDOT_F411RE/ARMC6/mbed-os/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F411xE/system_clock.o) rejected in favor of Symbol defined in .text.SetSysClock_PLL_HSE(BUILD/MTS_MDOT_F411RE/ARMC6/mbed-os/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F411xE/TARGET_MTS_MDOT_F411RE/system_clock.o).
[Error] @0,0: L6218E: Undefined symbol mts::Text::bin2hexString(std::__2::vector<unsigned char, std::__2::allocator<unsigned char> > const&, char const*, bool, bool) (referred from BUILD/MTS_MDOT_F411RE/ARMC6/examples/src/dot_util.o).
[Error] @0,0: L6218E: Undefined symbol mDot::setNetworkId(std::__2::vector<unsigned char, std::__2::allocator<unsigned char> > const&) (referred from BUILD/MTS_MDOT_F411RE/ARMC6/examples/src/dot_util.o).
[Error] @0,0: L6218E: Undefined symbol mDot::setNetworkKey(std::__2::vector<unsigned char, std::__2::allocator<unsigned char> > const&) (referred from BUILD/MTS_MDOT_F411RE/ARMC6/examples/src/dot_util.o).
[Error] @0,0: L6218E: Undefined symbol mDot::setNetworkName(std::__2::basic_string<char, std::__2::char_traits<char>, std::__2::allocator<char> > const&) (referred from BUILD/MTS_MDOT_F411RE/ARMC6/examples/src/dot_util.o).
[Error] @0,0: L6218E: Undefined symbol mDot::setDataSessionKey(std::__2::vector<unsigned char, std::__2::allocator<unsigned char> > const&) (referred from BUILD/MTS_MDOT_F411RE/ARMC6/examples/src/dot_util.o).
[Error] @0,0: L6218E: Undefined symbol mDot::setNetworkAddress(std::__2::vector<unsigned char, std::__2::allocator<unsigned char> > const&) (referred from BUILD/MTS_MDOT_F411RE/ARMC6/examples/src/dot_util.o).
[Error] @0,0: L6218E: Undefined symbol mDot::setNetworkPassphrase(std::__2::basic_string<char, std::__2::char_traits<char>, std::__2::allocator<char> > const&) (referred from BUILD/MTS_MDOT_F411RE/ARMC6/examples/src/dot_util.o).
[Error] @0,0: L6218E: Undefined symbol mDot::setNetworkSessionKey(std::__2::vector<unsigned char, std::__2::allocator<unsigned char> > const&) (referred from BUILD/MTS_MDOT_F411RE/ARMC6/examples/src/dot_util.o).
[Error] @0,0: L6218E: Undefined symbol mDot::send(std::__2::vector<unsigned char, std::__2::allocator<unsigned char> > const&, bool const&, bool const&) (referred from BUILD/MTS_MDOT_F411RE/ARMC6/examples/src/dot_util.o).
[Error] @0,0: L6218E: Undefined symbol std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::compare(unsigned int, unsigned int, char const*, unsigned int) const (referred from ./examples/libmDot/libmDot-ARMC6.ar(mDot.o)).
[Error] @0,0: L6218E: Undefined symbol std::__1::__vector_base_common<true>::__throw_length_error() const (referred from ./examples/libmDot/libmDot-ARMC6.ar(mDot.o)).
[Error] @0,0: L6218E: Undefined symbol std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init(char const*, unsigned int) (referred from ./examples/libmDot/libmDot-ARMC6.ar(mDot.o)).
[Error] @0,0: L6218E: Undefined symbol std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::append(char const*, unsigned int) (referred from ./examples/libmDot/libmDot-ARMC6.ar(mDot.o)).
[Error] @0,0: L6218E: Undefined symbol std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::assign(char const*) (referred from ./examples/libmDot/libmDot-ARMC6.ar(mDot.o)).
[Error] @0,0: L6218E: Undefined symbol std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) (referred from ./examples/libmDot/libmDot-ARMC6.ar(mDot.o)).
[Error] @0,0: L6218E: Undefined symbol std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_string__sub_object() (referred from ./examples/libmDot/libmDot-ARMC6.ar(mDot.o)).
[Error] @0,0: L6218E: Undefined symbol std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::operator=(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) (referred from ./examples/libmDot/libmDot-ARMC6.ar(mDot.o)).
[Error] @0,0: L6218E: Undefined symbol std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::find_first_of(char const*, unsigned int, unsigned int) const (referred from ./examples/libmDot/libmDot-ARMC6.ar(MTSText.o)).
[Error] @0,0: L6218E: Undefined symbol std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::find(char, unsigned int) const (referred from ./examples/libmDot/libmDot-ARMC6.ar(MTSText.o)).
[Error] @0,0: L6218E: Undefined symbol std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::append(char const*) (referred from ./examples/libmDot/libmDot-ARMC6.ar(MTSText.o)).
[Error] @0,0: L6218E: Undefined symbol std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::push_back(char) (referred from ./examples/libmDot/libmDot-ARMC6.ar(MTSText.o)).
[Error] @0,0: L6218E: Undefined symbol std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int, unsigned int, std::__1::allocator<char> const&) (referred from ./examples/libmDot/libmDot-ARMC6.ar(MTSText.o)).
Warning: L3912W: Option 'legacyalign' is deprecated.
解決方法
参考にしたサイト: https://forums.mbed.com/t/unable-to-build-xdot-examples/18516
ここのサイトでの解決方法はこのように書いてあります。
Use mbed-cli with GCC_ARM which currently you are trying to
Use GCC on MbedStudio. See : Switching to GCC - Installing | Mbed Studio Documentation 1
ARMコンパイラが原因だそうです。
解決方法は2つです。
- Mbed-cliでGcc Armでコンパイル。
- Mbed StudioのコンパイルをGcc Armに変更する。
今回は2. で解決しました。(1. でもできるそうだが、Mbed-cliで使用するライブラリの周りのバージョンを合わせるのに苦労して諦めました...)
Mbed Studioのコンパイラの変更は以下のサイトを参考にしました。
参考にしたサイト: https://os.mbed.com/docs/mbed-studio/current/installing/switching-to-gcc.html
Mbed Studio ships with Arm Compiler 6, but you can use the Arm Embedded GCC Compiler instead.
We test Mbed Studio with the Arm Embedded GCC Compiler version 9-2020-q2-update, but other versions may work.
Windows
In C:\Users{username}\AppData\Local\Mbed Studio, create the file external-tools.json and point it to your installation of GCC. For example:
{
"bundled": {
"gcc": "C:/Program Files (x86)/GNU Arm Embedded Toolchain/9 2020-q2-update/bin"
},
"defaultToolchain": "GCC_ARM"
}
Restart Mbed Studio to switch compilers.
Jsonファイルを作成して上記のコードをコピペします。
コンパイラのバージョンは 9-2020-q2-update を使用しました。
.exe版をダウンロードしてインストール。
コンパイラは以下のサイトから入手可能です。(入手にはARMのアカウント登録が必要です。)
サイト: https://developer.arm.com/downloads/-/gnu-rm
設定後、Mbed Studioを再起動すればOK。(再起動後、8 が表示されなければjsonファイルの設定が間違っています。)
まとめ
- バージョン 9-2020-q2-update ARMコンパイラをダウンロード。
- Mbed Studioの C:\Users{username}\AppData\Local\Mbed Studio に external-tools.json を追加。
- jsonファイルにARMコンパイラのPATHを入力。
- Mbed Studioを再起動。
- Mbed studioでコンパイル。