Armadilloフォーラム

Armadillo-440でのBoostライブラリの使用について

eagle-ss

2018年9月3日 21時25分

お世話になっております。
南と申します。

現在、Armadillo-640で動作していたコードをArmadillo-440に移植しております。
移植前と同じくBoostライブラリを使用したいと考えており、以下の設定を行いました。
その際、libboost-system-devのインストールに失敗しました。

〇開発環境
ATDE7(VMWare)→ATDE5(VMWare)

〇行った設定
・atmark@atde5:~$ sudo apt-get install g++-arm-linux-gnueabi
・atmark@atde5:~$ sudo apt-get install libboost-dev
・atmark@atde5:~$ sudo dpkg --add-architecture armel
・atmark@atde5:~$ sudo apt-get update
・atmark@atde5:~$ sudo apt-get install libboost-system-dev:armel ←問題発生
-----------------------------------エラー文ここから-----------------------------------
atmark@atde5:~$ sudo apt-get install libboost-system-dev:armel
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:

以下のパッケージには満たせない依存関係があります:
libboost-system-dev:armel : 依存: libboost-system1.49-dev:armel しかし、インストールされようとしていません
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。
-----------------------------------エラー文ここまで-----------------------------------

Armadillo-640を開発していた環境ではアーキテクチャがarmhfだったため、armelに変更してインストールしています。
libboost-system-devがインストールされていないため、現状でクロスコンパイルを行うと、以下のエラーが発生します。

〇コンパイル文
sudo arm-linux-gnueabi-g++ -lboost_system -pthread ./acsii_change.cpp ./acsii_change.hpp ./Trans_state.cpp ./Trans_state.hpp ./async_send2read.cpp ./async_send2read.hpp ./virtual_transmission.cpp ./virtual_transmission.hpp ./lcd.cpp ./lcd.hpp ./main.cpp

〇エラー内容
-----------------------------------ここから-----------------------------------
./acsii_change.cpp: In function ‘std::string int216(int)’:
./acsii_change.cpp:15:19: error: ‘to_string’ is not a member of ‘std’
./Trans_state.cpp:13:38: fatal error: boost/algorithm/string.hpp: そのようなファイルやディレクトリはありません
compilation terminated.
In file included from ./async_send2read.hpp:12:0,
from ./async_send2read.cpp:9:
./virtual_transmission.hpp:13:26: fatal error: boost/asio.hpp: そのようなファイルやディレクトリはありません
compilation terminated.
In file included from ./async_send2read.hpp:12:0:
./virtual_transmission.hpp:13:26: fatal error: boost/asio.hpp: そのようなファイルやディレクトリはありません
compilation terminated.
In file included from ./virtual_transmission.cpp:9:0:
./virtual_transmission.hpp:13:26: fatal error: boost/asio.hpp: そのようなファイルやディレクトリはありません
compilation terminated.
./virtual_transmission.hpp:13:26: fatal error: boost/asio.hpp: そのようなファイルやディレクトリはありません
compilation terminated.
In file included from ./async_send2read.hpp:12:0,
from ./lcd.cpp:9:
./virtual_transmission.hpp:13:26: fatal error: boost/asio.hpp: そのようなファイルやディレクトリはありません
compilation terminated.
In file included from ./async_send2read.hpp:12:0,
from ./main.cpp:1:
./virtual_transmission.hpp:13:26: fatal error: boost/asio.hpp: そのようなファイルやディレクトリはありません
compilation terminated.
-----------------------------------ここまで-----------------------------------

boostフォルダが認識できていない旨のエラーかと思われます。
libboost-devはインストールされているため、boostフォルダは現在以下の場所に配置されています。
usr/include/boost
しかし、コンパイルの際にこの場所を参照していないように感じます。

ご質問させて頂きたい点は以下となります。
質問1.現状でlibboost-system-devを正常にインストールするには、何を行えば良いでしょうか。
質問2.コンパイル文はATDE5に変更した過程で「arm-linux-gnueabihf-g++」から「arm-linux-gnueabi-g++」に変更していますが、
     この変更は正しいのでしょうか。

ご回答をお待ちしております。
以上、宜しくお願いいたします。

コメント

y.nakamura

2018年9月4日 3時43分

中村です。

Boostの話ではないのですが(Boostを使ったことないです)、
ATDE5でのクロスライブラリのインストール方法について、
不確かな情報ですが・・・

> ・atmark@atde5:~$ sudo apt-get install libboost-system-dev:armel ←問題発生

":armel"のようにしてクロスライブラリをインストールできる機能は
wheezyで対応になったというこを以前どこかで読んだ気がしますが、
ATDE5ではこれができなくて、dpkg-crossを使わないとだめなのかもしれません。
(他のライブラリですが、ATDE6では":armhf"でインストールしたことはあります)

実践開発ガイド第2部の
[2.3. ATDE5にクロス開発用ライブラリをインストールする]
https://manual.atmark-techno.com/armadillo-guide/armadillo-guide-2_ja-3…
では、dpkg-crossを使った方法が紹介されています。

https://packages.debian.org/wheezy/libboost-system-dev
と、これが依存するパッケージを全部とってきて、
それぞれdpkg-crossで変換して・・・
としなければならないのかも、です。

--
なかむら

eagle-ss

2018年9月4日 20時51分

お世話になっております。
南です。

中村様、ご返信ありがとうございます。
ご返信の内容を元に、ATDE5にてクロスライブラリのインストールに着手しておりますが、
一部のライブラリがインストールを行えずにおります。
以下に現状を記載します。

1.libboost-system-devと依存関係となっているライブラリの調査
中村様にご提示頂いたURL
https://packages.debian.org/wheezy/libboost-system-dev
の中で、赤丸で「依存」となっているライブラリを精査し、30種類のライブラリが依存関係にあることを確認しました。

2.dpkg-crossの実行
30種類のライブラリの中で、末端に当たるものから順に以下の手順を行いました。

2-1.「apt-cache search [ライブラリ名]」にて該当するライブラリの検索
     →末尾がarmel-crossとなっているライブラリがあるか確認
2-2.「apt-get download [ライブラリ名]-armel-cross」にてライブラリのダウンロード
2-3.「sudo dpkg -i [ダウンロードしたライブラリ名]」にてライブラリのインストール

・インストールできないパターン1
「apt-cache search」コマンドにて検索結果が表示されない。(ヒットしない)
例:libc0.1

・インストールできないパターン2
「apt-cache search」コマンドにてarmelのライブラリが見つからない。
見つかったarmel以外のライブラリをダウンロードし、以下のコマンドでクロスコンパイルをかけても失敗する。
例:libboost1.49.0
検索結果:libboost-system1.49.0のみ
ダウンロードしたライブラリ:libboost-system1.49.0_1.49.0-3.2_i386.deb
コマンド:dpkg --build --arch armel libboost-system1.49.0_1.49.0-3.2_i386.deb
実行結果:
Use of qw(...) as parentheses is deprecated at /usr/bin/dpkg-cross line 1046.
dpkg-cross: libboost-system-dev_1.49.0.1_i386.deb has wrong architecture (i386)
dpkg-cross: conversion of libboost-system-dev_1.49.0.1_i386.deb failed.

上記2パターンは共にlibboost-system-devの依存関係となっておりますが、
検索結果がない、又は検索結果に開発環境に適合するライブラリが存在しない結果となりました。

ここで、ご質問なのですが、
質問1.ライブラリパッケージの検索、ダウンロードするコマンドはaptコマンドで正しいのでしょうか。
質問2.使用するコマンドがaptコマンドで正しいとして、何かオプションが抜けているのでしょうか。

上記質問は正確にはArmadilloのフォーラムには相応しくない、Linuxの初歩的な質問であるかもしれませんが、
ご回答の程、宜しくお願い致します。

> 中村です。
>
> Boostの話ではないのですが(Boostを使ったことないです)、
> ATDE5でのクロスライブラリのインストール方法について、
> 不確かな情報ですが・・・
>
> > ・atmark@atde5:~$ sudo apt-get install libboost-system-dev:armel ←問題発生
>
> ":armel"のようにしてクロスライブラリをインストールできる機能は
> wheezyで対応になったというこを以前どこかで読んだ気がしますが、
> ATDE5ではこれができなくて、dpkg-crossを使わないとだめなのかもしれません。
> (他のライブラリですが、ATDE6では":armhf"でインストールしたことはあります)
>
> 実践開発ガイド第2部の
> [2.3. ATDE5にクロス開発用ライブラリをインストールする]
> https://manual.atmark-techno.com/armadillo-guide/armadillo-guide-2_ja-3…
> では、dpkg-crossを使った方法が紹介されています。
>
> https://packages.debian.org/wheezy/libboost-system-dev
> と、これが依存するパッケージを全部とってきて、
> それぞれdpkg-crossで変換して・・・
> としなければならないのかも、です。
>
> --
> なかむら
>

y.nakamura

2018年9月4日 22時51分

中村です。

> ダウンロードしたライブラリ:libboost-system1.49.0_1.49.0-3.2_i386.deb
> コマンド:dpkg --build --arch armel libboost-system1.49.0_1.49.0-3.2_i386.deb

取得するのは、"xxxx_i386.deb"ではなくて"xxxx_armel.deb"です。
https://manual.atmark-techno.com/armadillo-guide/armadillo-guide-2_ja-3…
の説明をよく読みましょう。

https://packages.debian.org/wheezy/libboost-system-dev
https://packages.debian.org/wheezy/libboost-system1.49.0
https://packages.debian.org/wheezy/libboost-system1.49-dev
https://packages.debian.org/wheezy/libboost1.49-dev
からarmel用のパッケージを取得(ダウンロード)します。

$ wget http://ftp.jp.debian.org/debian/pool/main/b/boost-defaults/libboost-sys…
$ wget http://ftp.jp.debian.org/debian/pool/main/b/boost1.49/libboost-system1…
$ wget http://ftp.jp.debian.org/debian/pool/main/b/boost1.49/libboost-system1…
$ wget http://ftp.jp.debian.org/debian/pool/main/b/boost1.49/libboost1.49-dev_…

依存パッケージは
libc6 (>= 2.4)
libgcc1 (>= 1:4.4.0)
libstdc++6 (>= 4.4.0)
libstdc++6-4.4-dev
libicu48 (>= 4.8-1)
のようですが、これらは全部ATDE5に入っていました。

たとえば、libicu48は次のとおりです。
$ dpkg -l | grep libicu48 | grep armel-cross
ii libicu48-armel-cross 4.8.1.1-12+deb7u1 all International Components for Unicode (for cross-compiling)

ダウンロードした4つのdebファイルをdpkg-crossで変換するのですが、
libboost-system-dev_1.49.0.1_armel.debは次のように怒られてしまいました。
$ dpkg-cross --build --arch armel -M libboost-system-dev_1.49.0.1_armel.deb
Use of qw(...) as parentheses is deprecated at /usr/bin/dpkg-cross line 1046.
dpkg-cross: package libboost-system-dev doesn't provide any useful files. Skipping.

中身を見てみると・・・
$ dpkg -c libboost-system-dev_1.49.0.1_armel.deb
drwxr-xr-x root/root 0 2012-03-28 12:41 ./
drwxr-xr-x root/root 0 2012-03-28 12:41 ./usr/
drwxr-xr-x root/root 0 2012-03-28 12:41 ./usr/share/
drwxr-xr-x root/root 0 2012-03-28 12:41 ./usr/share/doc/
drwxr-xr-x root/root 0 2012-03-28 12:41 ./usr/share/doc/libboost-system-dev/
-rw-r--r-- root/root 1058 2011-04-06 14:19 ./usr/share/doc/libboost-system-dev/copyright
-rw-r--r-- root/root 806 2012-03-28 11:47 ./usr/share/doc/libboost-system-dev/changelog.gz
と、copyrightとchangelogだけなので、これは無視してもよさそうです。

残り3つをdpkg-crossします。
$ dpkg-cross --build --arch armel -M libboost-system1.49.0_1.49.0-3.2_armel
$ dpkg-cross --build --arch armel -M libboost-system1.49-dev_1.49.0-3.2_armel.deb
$ dpkg-cross --build --arch armel -M libboost1.49-dev_1.49.0-3.2_armel.deb

$ ls *armel-cross*
libboost-system1.49-dev-armel-cross_1.49.0-3.2_all.deb
libboost-system1.49.0-armel-cross_1.49.0-3.2_all.deb
libboost1.49-dev-armel-cross_1.49.0-3.2_all.deb

この3つをdpkgでインストールします。
$ sudo dpkg -i \
libboost-system1.49.0-armel-cross_1.49.0-3.2_all.deb \
libboost-system1.49-dev-armel-cross_1.49.0-3.2_all.deb \
libboost1.49-dev-armel-cross_1.49.0-3.2_all.deb
以前に未選択のパッケージ libboost-system1.49.0-armel-cross を選択しています。
(データベースを読み込んでいます ... 現在 179443 個のファイルとディレクトリがインストールされています。)
(libboost-system1.49.0-armel-cross_1.49.0-3.2_all.deb から) libboost-system1.49.0-armel-cross を展開しています...
以前に未選択のパッケージ libboost-system1.49-dev-armel-cross を選択しています。
(libboost-system1.49-dev-armel-cross_1.49.0-3.2_all.deb から) libboost-system1.49-dev-armel-cross を展開しています...
以前に未選択のパッケージ libboost1.49-dev-armel-cross を選択しています。
(libboost1.49-dev-armel-cross_1.49.0-3.2_all.deb から) libboost1.49-dev-armel-cross を展開しています...
libboost-system1.49.0-armel-cross (1.49.0-3.2) を設定しています ...
libboost1.49-dev-armel-cross (1.49.0-3.2) を設定しています ...
libboost-system1.49-dev-armel-cross (1.49.0-3.2) を設定しています ...

エラーなく終了したようです。

昨日書いたようにBoostはわかりませんので、
この先は私には確認できません。

なお、最初の質問投稿で
> ・atmark@atde5:~$ sudo apt-get install g++-arm-linux-gnueabi
が書いてありましたが、g++-arm-linux-gnueabiはATDE5に入ってます。
$ dpkg -l | grep g++-arm
してみてください。

これも参考にするといいかも、です。
https://download.atmark-techno.com/atde/atde5-i386-dpkg-list.txt

--
なかむら

y.nakamura

2018年9月4日 23時00分

中村です。

質問をよく読んでいないところがありました。

> 取得するのは、"xxxx_i386.deb"ではなくて"xxxx_armel.deb"です。
> https://manual.atmark-techno.com/armadillo-guide/armadillo-guide-2_ja-3…
> の説明をよく読みましょう。
と書きましたが、

>> 「apt-cache search」コマンドにてarmelのライブラリが見つからない。
>> 見つかったarmel以外のライブラリをダウンロードし、以下のコマンドでクロスコンパイルをかけても失敗する。
だったのですね。

失礼しました。

--
なかむら