C++のコードをARM用にコンパイルする
Posted
C++のソースコードをubuntu(x86/x64)とCMakeを使ってARM上で動くようにコンパイルする。
ARMについて
ARM
はARM 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++)