cRIO(RealTimeLinux)用のC/C++クロスコンパイル環境をUbuntu上に作る
C/C++SDKをUbuntu20.04 64bitにインストール、サンプルをビルドするまで
以下、cRIOと記載した場合は、 CPUにAtom(x86_64)、OSにRealTimeLinuxを搭載 したものを指します。また、LabVIEWやRealTimeモジュールのバージョンは2018以降と考えてください。
SDKのダウンロード
C/C++ SDKは、NIダウンロードサイトで入手可能。400MB近くあるので注意。
GNU C & C++コンパイルツールx64 のダウンロード - NI
Windows版SDKはログインしなくてもダウンロードできるが、LInux版SDKはダウンロードできない(ダウンロードボタンが無効になっている)
Windows版SDKのDLが誰でもOKで、Linux版SDKのDLにはSSP購入が必要とか、なんだか変な条件だと思う。
そういえば、LabVIEW CommunityEditionのLinux版も相変わらずActivation不能の状態で半年以上放置されたままで、
なんのためにLinux 版をリリースして公開までしているのか、さっぱりわからん。
これだけLinuxが普及しても、NIのLinuxユーザへの塩対応は相変わらず。
(Silverlightのサポート切られたり散々な目にあわされているのにMSローカル技術依存から脱却できず。このままRasPiに市場をとられることになりそうですね。)
SDKの使い方についての資料
WIndowsホスト用SDKをVisualStudioCodeから利用する方法についてのドキュメントが公開されていますので、 それを参考にします。
Linuxホスト用SDKのインストール
SDKには、C/C++コンパイラなどの最低限の開発ツールが含まれています。
(Ubuntu用のC/C++やツールチェインは不要、インストールしなくてもよいです。)
それに加えて、CMakeとninjaというビルドツールのインストール。
さらに、CMakeかninjaのインストールでPythonが必要らしかったので、それもインストール。
$ sudo apt-get update $ sudo apt-get install python3 cmake ninja-build
サンプルのビルド
先に紹介したCrossCompileのドキュメントから、Windowsホスト用のテンプレートをダウンロードして、 それを元にLinuxホストでビルドしてみます。
テンプレートのダウンロード
Template.zipダウンロード
CMakeList.txtの修正
CMakeList.txtは、Makefileにあたるもので、ビルド手順を設定したファイルです。
ダウンロードしたTemplate.zipを展開して、NI_Linux_RT_x64_Template/build/CMakeList.txtをコピーして利用します。
- SDKのインストールされたパスに修正する
- サンプルアプリケーションのビルド設定を追加する
Windowsホスト用のCMakeList.txt
コンパイラなどのツールのパスがWindowsホスト用になっています。
set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR x86_64) # root path for toolchains set(toolchain_path C:/build/18.0/x64/sysroots) # compilers set(CMAKE_C_COMPILER ${toolchain_path}/i686-nilrtsdk-mingw32/usr/bin/x86_64-nilrt-linux/x86_64-nilrt-linux-gcc.exe) set(CMAKE_CXX_COMPILER ${toolchain_path}/i686-nilrtsdk-mingw32/usr/bin/x86_64-nilrt-linux/x86_64-nilrt-linux-g++.exe) # compiler flags set(CMAKE_SYSROOT ${toolchain_path}/core2-64-nilrt-linux) set(CMAKE_<LANG>_STANDARD_INCLUDE_DIRECTORIES ${toolchain_path}/core2-64-nilrt-linux/usr/include/c++/4.9.2 ${toolchain_path}/core2-64-nilrt-linux/usr/include/c++/4.9.2/x86_64-nilrt-linux) set(CMAKE_<LANG>_FLAGS "-Wall -fmessage-length=0") set(CMAKE_<LANG>_FLAGS_DEBUG "-O0 -g3") set(CMAKE_<LANG>_FLAGS_RELEASE "-O3") # define search behavior set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
Linuxホスト用に修正したCMaikeList.txt
コンパイラなどのツールのパスをLinuxホスト用に修正しています。
それに加えて、project(hello)、add_executalble()でビルド設定を追加しています。
cmake_minimum_required(VERSION 3.2) project(hello) add_executable(hello ../src/hello.c) set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR x86_64) # root path for toolchains set(toolchain_path /usr/local/oecore-x86_64/sysroots) # compilers set(CMAKE_C_COMPILER ${toolchain_path}/x86_64-nilrtsdk-linux/usr/bin/x86_64-nilrt-linux/x86_64-nilrt-linux-gcc) set(CMAKE_CXX_COMPILER ${toolchain_path}/x86_64-nilrtsdk-linux/usr/bin/x86_64-nilrt-linux/x86_64-nilrt-linux-g++) # compiler flags set(CMAKE_SYSROOT ${toolchain_path}/core2-64-nilrt-linux) set(CMAKE_<LANG>_STANDARD_INCLUDE_DIRECTORIES ${toolchain_path}/core2-64-nilrt-linux/usr/include/c++/6.3.0 ${toolchain_path}/core2-64-nilrt-linux/usr/include/c++/6.3.0/x86_64-nilrt-linux) set(CMAKE_<LANG>_FLAGS "-Wall -fmessage-length=0") set(CMAKE_<LANG>_FLAGS_DEBUG "-O0 -g3") set(CMAKE_<LANG>_FLAGS_RELEASE "-O3") # define search behavior set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
プロジェクトフォルダを作成、フォルダ構成は以下のようにする
<Project> <src> hello.c <build> CMakeList.txt
CMakeList.txtの配置
CMakeList.txtファイルはbuildフォルダに配置する
サンプルソース(hello.c)を作成
サンプルソース(hello.c)を作成して、srcフォルダに保存する
hello.c
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { puts("Hello, world"); return EXIT_SUCCESS; }
CMakeでNinja用のビルドファイルを生成
build フォルダに移動、以下のコマンドを実行
$ CMake -G Ninja
生成されたビルド設定を元に ninja を使って、実行ファイルをビルドする
build フォルダに移動、以下のコマンドを実行
$ ninja
hello.c から hello という実行ファイルが瞬時に作成される。
出来上がった実行ファイルを、cRIOにコピーして動作を確認する。
Windows版のSDKでの開発についてのドキュメントでは、VisualStudioCodeを使った手順の説明となっており、
このあと、GDB を使ったリモートデバッグの方法の説明になる。
VisualStudioCodeはLinux版もでてきているので、興味のある方はトライしてみてほしい。
サンプルソース
サンプルソースはこちらで公開しています。
alucky4416 / docker_ubuntu_rtlsdk_x64 · GitLab
蛇足
できあがった実行ファイルのサイズは、Go言語で同じようなソースからビルドした実行ファイルよりかなり小さい。
(Go言語でビルドした実行ファイルはかなり大きい、という表現の方が適切かな?)
今回、SDKを使ってcRIO用にビルドした実行ファイルはcRIOでは当然動くが、Ubuntu(x64)で実行しようとするとエラーになる。
CPUも同じx86_64で、OSもLinuxだから動きそうな気がするが、外部ライブラリ依存の違いなのかと思う。