C++のコードをARM用にコンパイルする

programing

C++のソースコードをubuntu(x86/x64)とCMakeを使ってARM上で動くようにコンパイルする。

ARMについて

ARMARM Ltdによって設計されたCPUのアーキテクチャ。ARMはこれを自らは製造しておらず、intelやfreescaleなどがライセンス供与して製造している。

ARMはCPUの命令セットのアーキテクチャとしてRISC(ReduceInstructionSetComputer)を採用している。これは命令の数を減らし、回路を単純化することで演算の速度を高速にしようとする設計手法。ARMは

ARMはスマートフォンなどの小型の端末に広く採用されている。

コンパイラのインストール

armがhfなのかarm64なのかでコンパイラが変わる。コンパイラは変わるが、操作は基本的には同じ。

for hf

$ sudo apt install g++-arm-linux-gnueabihf

インストールはこれだけだが、gnueabihfという部分について触れておく。 gnu,eabi,hfが連結されている。

eabiはARMのABI(ApplicationBinaryInterface)の一つで、ARMのABIにはもう一つ、oabiがある。eabiはEmbeddedApplicationBinaryInterface、oabiはOldApplicationBinaryInterfaceの略。
hfはHardFloatの略。Floatと名がつく通り、浮動小数点の扱いについての表記。

for arm64

$ sudo apt install g++-aarch64-linux-gnu

CMakeでコンパイラの指定

いくつか方法がある。

cmake実行時のオプションで指定する

CMAKE_CXX_COMPILER(C++用)とCMAKE_C_COMPILER(C用)がcmake内でコンパイラのパスが格納される場所になるので、cmakeコマンド実行時にパスを指定する。下記のようになる。(/usr/bin/arm-linux-gnueabihf-g++-7を指定している。)

$~/_build$ cmake -DCMAKE_CXX_COMPILER=/usr/bin/arm-linux-gnueabihf-g++-7 -DCMAKE_CXX_COMPILER=/usr/bin/arm-linux-gnueabihf-gcc-7 ..

toolchainを使う

cmakeに下記の行を追加してコンパイラを指定する。直接書き込みたくなければ、CMakeのツールチェイン機能を使って指定することも出来る。その際は、cmakeコマンドに-DCMAKE_TOOLCHAIN_FILE=<ツールチェイン用のcmakeファイル>オプションを渡してあげる。

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_C_COMPILER /usr/bin/arm-linux-gnueabihf-g++)