Armadilloフォーラム

Armadillo-610でcmakeとg++でコンパイル

kawasan_mt

2023年9月26日 12時03分

川島@MTです。いつもお世話になっております。

添付ファイルのタイマー動作評価プログラムをArmadillo-610で動作させたいのですが、
ATDE9でのcmakeのクロスコンパイル用の適用方法を知りたいです。

標準Install環境ではクロスコンパイル用のg++がインストールされていない様です。
別途Install作業が必要でしょうか?

また、クロスコンパイル以前に素のATDE9(Debian)と別環境(Ubuntu)との差異で気になるところがあります。
(何かしらのライブラリのinstallが必要?)
cmakeの際にSuccessの所がFailedになっている。
その為か、make後にエラーになります。
以下は抜粋引用。詳細は添付ファイルをご確認ください。

kawasan@cyobi4:~/tmp$ unzip periodic-timer-sample.zip 
kawasan@cyobi4:~/tmp$ cd periodic-timer-sample/
kawasan@cyobi4:~/tmp/periodic-timer-sample$ mkdir build
kawasan@cyobi4:~/tmp/periodic-timer-sample$ cd build
kawasan@cyobi4:~/tmp/periodic-timer-sample/build$ cmake ..
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success
kawasan@cyobi4:~/tmp/periodic-timer-sample/build$ make
→実行ファイルmainが生成される
 
atmark@atde9:~/usr/src/apl$ unzip periodic-timer-sample.zip 
atmark@atde9:~/usr/src/apl$ cd periodic-timer-sample
atmark@atde9:~/usr/src/apl/periodic-timer-sample$ mkdir build
atmark@atde9:~/usr/src/apl/periodic-timer-sample$ cd build
atmark@atde9:~/usr/src/apl/periodic-timer-sample/build$ cmake ..
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
atmark@atde9:~/usr/src/apl/periodic-timer-sample/build$ make
Scanning dependencies of target main
[ 50%] Building CXX object bench/CMakeFiles/main.dir/main.cpp.o
[100%] Linking CXX executable main
/usr/bin/ld: CMakeFiles/main.dir/main.cpp.o: in function `POSIXTimer<Callback>::stop()':
main.cpp:(.text._ZN10POSIXTimerI8CallbackE4stopEv[_ZN10POSIXTimerI8CallbackE4stopEv]+0x25): undefined reference to `timer_delete'
/usr/bin/ld: CMakeFiles/main.dir/main.cpp.o: in function `POSIXTimer<Callback>::start(Callback*, unsigned int)':
main.cpp:(.text._ZN10POSIXTimerI8CallbackE5startEPS0_j[_ZN10POSIXTimerI8CallbackE5startEPS0_j]+0x7e): undefined reference to `timer_create'
/usr/bin/ld: main.cpp:(.text._ZN10POSIXTimerI8CallbackE5startEPS0_j[_ZN10POSIXTimerI8CallbackE5startEPS0_j]+0x9c): undefined reference to `timer_settime'
collect2: error: ld returned 1 exit status
make[2]: *** [bench/CMakeFiles/main.dir/build.make:103: bench/main] エラー 1
make[1]: *** [CMakeFiles/Makefile2:113: bench/CMakeFiles/main.dir/all] エラー 2
make: *** [Makefile:103: all] エラー 2

お手数ですが、ご教授のほど、よろしくお願いします。

ファイル ファイルの説明
periodic-timer-sample.zip タイマーサンプルC++プログラム
log_ubuntu.txt サンプル操作(Ubuntu)
log_atde9.txt サンプル操作(ATDE9 Debian)
コメント

at_dominique.m…

2023年9月26日 15時27分

川島さん

マルティネです。

> また、クロスコンパイル以前に素のATDE9(Debian)と別環境(Ubuntu)との差異で気になるところがあります。
> (何かしらのライブラリのinstallが必要?)
> cmakeの際にSuccessの所がFailedになっている。
> その為か、make後にエラーになります。

そこを先に回答させていただきます。

問題のtimer_delete または timer_create, timer_settime は glibc 2.34 で追加されましたが、ATDE9 (debian bullseye) の glibc は 2.31 のままです。
glibc だけを更新することはできませんので、この periodic-timer-sample をビルドするには新しい OS を使う必要があります。
(あるいは、プログラムがそれを使わないように修正もできます)

Armadillo Base OS で任意のコンテナを使えますので、新しい debian 又は ubuntu や alpine のコンテナを使えば問題なく使えます。

起動はその対応で問題ないですが、別の OS で起動する場合は ATDE で直接にクロスコンパイルできなくなります。
ATDE は qemu で arm のバイナリを実行できますので、使用したいコンテナを ATDE で起動して、その中に cmake や g++ をインストールすればいつもどおりにビルドできると思います。
ビルド自体はクロスビルドより少し遅いですが、この程度のプロジェクトであればクロスビルドの環境を作る時間に比べたらすぐに使える物ができると思います。

よろしくお願いします。

マルティネさん
川島@MTです。返信ありがとうございます。

> 起動はその対応で問題ないですが、別の OS で起動する場合は ATDE で直接にクロスコンパイルできなくなります。
> ATDE は qemu で arm のバイナリを実行できますので、使用したいコンテナを ATDE で起動して、その中に cmake や g++ をインストールすればいつもどおりにビルドできると思います。
> ビルド自体はクロスビルドより少し遅いですが、この程度のプロジェクトであればクロスビルドの環境を作る時間に比べたらすぐに使える物ができると思います。

docker (ubuntu 22.04)で試してみます。

よろしくお願いします。

マルティネさん
川島@MTです。

docker(ubuntu 22.04)でできました。
今件、クローズします。

以下、メモ。

「x86のLinux環境からdockerを利用してクロス環境を起動」で、欲しいイメージのWeb
https://hub.docker.com/layers/library/ubuntu/22.04/images/sha256-2589fe…

DIGEST値を指定してpull

atmark@atde9:~/usr/src/a610$ sudo docker pull ubuntu@sha256:2589fe6bcf90466564741ae0d8309d1323f33b6ec8a5d401a62d0b256bcc3c37 
docker.io/library/ubuntu@sha256:2589fe6bcf90466564741ae0d8309d1323f33b6ec8a5d401a62d0b256bcc3c37: Pulling from library/ubuntu 
d79cf5fbd02b: Pull complete  
Digest: sha256:2589fe6bcf90466564741ae0d8309d1323f33b6ec8a5d401a62d0b256bcc3c37 
Status: Downloaded newer image for ubuntu@sha256:2589fe6bcf90466564741ae0d8309d1323f33b6ec8a5d401a62d0b256bcc3c37 
docker.io/library/ubuntu@sha256:2589fe6bcf90466564741ae0d8309d1323f33b6ec8a5d401a62d0b256bcc3c37 
atmark@atde9:~/usr/src/a610$ sudo docker images 
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE 
ubuntu       <none>    5edd8b11048d   6 weeks ago   55.3MB 
atmark@atde9:~/usr/src/a610$ sudo docker ps -a 
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
atmark@atde9:~/usr/src/a610$ sudo docker run --name ubuntu-arm -it 5edd8b11048d /bin/bash 
WARNING: The requested image's platform (linux/arm/v7) does not match the detected host platform (linux/amd64) and no specific platform was requested 
root@bfbd25b1f470:/# uname -a 
Linux bfbd25b1f470 5.10.0-25-amd64 #1 SMP Debian 5.10.191-1 (2023-08-16) armv7l armv7l armv7l GNU/Linux
root@bfbd25b1f470:/# ldd --version
ldd (Ubuntu GLIBC 2.35-0ubuntu3.3) 2.35
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.

docker(ubuntu-arm)での環境構築メモ

root@bfbd25b1f470:/# apt update
root@bfbd25b1f470:/# apt -y upgrade
root@bfbd25b1f470:/# apt -y install build-essential gcc g++ make libtool texinfo dpkg-dev pkg-config
root@bfbd25b1f470:/# apt -y install git cmake cmake-curses-gui cmake-gui curl wget p7zip-full

TPコンパイル

root@bfbd25b1f470:~/usr/src/periodic-timer-sample# ls -l
total 36
-rw-rw-r-- 1 1000 1000  179 Jun 13 07:00 CMakeLists.txt
-rw-rw-r-- 1 1000 1000 1068 Jun 13 07:00 LICENSE
-rw-rw-r-- 1 1000 1000  208 Jun 13 07:00 README.md
drwxrwxr-x 2 1000 1000 4096 Jun 15 03:07 _old
-rw-rw-r-- 1 1000 1000 2445 Jun 15 03:09 analysis.py
drwxrwxr-x 2 1000 1000 4096 Jun 13 07:00 bench
drwxrwxr-x 2 1000 1000 4096 Jun 13 07:00 data
drwxrwxr-x 5 1000 1000 4096 Jun 13 07:00 include
drwxrwxr-x 3 1000 1000 4096 Jun 15 06:21 stats0
root@bfbd25b1f470:~/usr/src/periodic-timer-sample# mkdir build
root@bfbd25b1f470:~/usr/src/periodic-timer-sample# cd build/
root@bfbd25b1f470:~/usr/src/periodic-timer-sample/build# cmake ..
-- The C compiler identification is GNU 11.4.0
-- The CXX compiler identification is GNU 11.4.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success
-- Found Threads: TRUE  
-- Configuring done
-- Generating done
-- Build files have been written to: /root/usr/src/periodic-timer-sample/build
root@bfbd25b1f470:~/usr/src/periodic-timer-sample/build# make
[ 50%] Building CXX object bench/CMakeFiles/main.dir/main.cpp.o
In file included from /usr/include/c++/11/vector:72,
                 from /root/usr/src/periodic-timer-sample/bench/main.cpp:14:
/usr/include/c++/11/bits/vector.tcc: In member function 'std::vector<_Tp, _Alloc>::reference std::vector<_Tp, _Alloc>::emplace_back(_Args&& ...) [with _Args = {long long int}; _Tp = long long int; _Alloc = std::allocator<long long int>]':
/usr/include/c++/11/bits/vector.tcc:121:28: note: parameter passing for argument of type '__gnu_cxx::__normal_iterator<long long int*, std::vector<long long int> >' changed in GCC 7.1
  121 |           _M_realloc_insert(end(), std::forward<_Args>(__args)...);
      |           ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/c++/11/bits/vector.tcc: In member function 'void std::vector<_Tp, _Alloc>::_M_realloc_insert(std::vector<_Tp, _Alloc>::iterator, _Args&& ...) [with _Args = {long long int}; _Tp = long long int; _Alloc = std::allocator<long long int>]':
/usr/include/c++/11/bits/vector.tcc:426:7: note: parameter passing for argument of type 'std::vector<long long int>::iterator' changed in GCC 7.1
  426 |       vector<_Tp, _Alloc>::
      |       ^~~~~~~~~~~~~~~~~~~
[100%] Linking CXX executable main
[100%] Built target main
root@bfbd25b1f470:~/usr/src/periodic-timer-sample/build# ls -l bench 
total 124
drwxr-xr-x 3 root root   4096 Sep 28 01:49 CMakeFiles
-rw-r--r-- 1 root root   5789 Sep 28 01:49 Makefile
-rw-r--r-- 1 root root   1255 Sep 28 01:49 cmake_install.cmake
-rwxr-xr-x 1 root root 107232 Sep 28 01:49 main

Armadillo-610でmain実行 (プロンプト:#はABOS、c#はdocker(ubuntu))

# abos-ctrl podman-storage --status
# abos-ctrl podman-storage --disk
# vi /etc/atmark/containers/ubuntu.conf 
set_image ubuntu:22.04 
add_args -it 
set_autostart no 
set_command /bin/bash
 
# persist_file /etc/atmark/containers/ubuntu.conf
# podman pull docker.io/ubuntu:22.04
# podman_start ubuntu
# podman attach ubuntu
 
c# mkdir ~/tmp
c# cd ~/tmp
{なんらかの手段でmainファイルを取得}
c# chmod +x main
c# main

stats.csvが生成できた。