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

WindowsSDKはログインしなくてもダウンロードできるが、LInuxSDKはダウンロードできない(ダウンロードボタンが無効になっている)
WindowsSDKのDLが誰でもOKで、LinuxSDKのDLにはSSP購入が必要とか、なんだか変な条件だと思う。
そういえば、LabVIEW CommunityEditionのLinux版も相変わらずActivation不能の状態で半年以上放置されたままで、 なんのためにLinux 版をリリースして公開までしているのか、さっぱりわからん。
これだけLinuxが普及しても、NIのLinuxユーザへの塩対応は相変わらず。
Silverlightのサポート切られたり散々な目にあわされているのにMSローカル技術依存から脱却できず。このままRasPiに市場をとられることになりそうですね。)

SDKの使い方についての資料

WIndowsホスト用SDKをVisualStudioCodeから利用する方法についてのドキュメントが公開されていますので、 それを参考にします。

NI Linux Real-Time Cross Compiling: Using the NI Linux Real-Time Cross Compile Toolchain with Visual Studio Code - NI Community

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をコピーして利用します。

  1. SDKのインストールされたパスに修正する
  2. サンプルアプリケーションのビルド設定を追加する

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だから動きそうな気がするが、外部ライブラリ依存の違いなのかと思う。