mDotのサンプルコードがコンパイルできないとき

# 前提条件
## ハードウェア
* 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つです。
1. Mbed-cliでGcc Armでコンパイル。
1. 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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3122346/4182c707-a0a0-61d8-ed47-57f3c22e48d6.png)

設定後、Mbed Studioを再起動すればOK。(再起動後、__8__ が表示されなければjsonファイルの設定が間違っています。)



# まとめ

1. バージョン __9-2020-q2-update__ ARMコンパイラをダウンロード。
1. Mbed Studioの __C:\Users\{username}\AppData\Local\Mbed Studio__ に __external-tools.json__ を追加。
1. jsonファイルにARMコンパイラのPATHを入力。
1. Mbed Studioを再起動。
1. Mbed studioでコンパイル。