Armadilloフォーラム

libjpeg turboのリンクについて

tanaka.kenji

2015年4月15日 20時00分

田中と申します。

Armadillo-810でのlibjpeg-turboの使い方について教えてください。

現状、通常のlibjpegを使用したアプリの動作は確認できているのですが、
libjpeg-turboへの置き換えを行いたいと思っております。

基本的なことで恐縮なのですが、libjpeg-turboへの置き換えを行う場合、
Makefileでのライブラリの指定を-ljpegから-lturbojpegに変更するだけではダメで
アプリのコード自体も変更が必要なのでしょうか?

Makefileだけ修正してみたところ、以下のようなエラーが出るのでダメなのだとは思うのですが。
lturbojpegの使用方法に関して参考になるものがあれば教えていただけると助かります。

=== エラー内容 ===
/usr/lib/gcc/arm-linux-gnueabihf/4.6/../../../../arm-linux-gnueabihf/bin/ld: ./src/spRecord.o: undefined reference to symbol 'jpeg_set_quality@@LIBJPEG_8.0'
/usr/lib/gcc/arm-linux-gnueabihf/4.6/../../../../arm-linux-gnueabihf/bin/ld: note: 'jpeg_set_quality@@LIBJPEG_8.0' is defined in DSO /usr/arm-linux-gnueabihf/lib/libjpeg.so.8 so try adding it to the linker command line
/usr/arm-linux-gnueabihf/lib/libjpeg.so.8: could not read symbols: Invalid operation

コメント

y.nakamura

2015年4月15日 20時38分

中村です。

> 基本的なことで恐縮なのですが、libjpeg-turboへの置き換えを行う場合、
> Makefileでのライブラリの指定を-ljpegから-lturbojpegに変更するだけではダメで
> アプリのコード自体も変更が必要なのでしょうか?

使ったことがないので、ググった情報を元にしてますが・・・
リンクするときではなくて、実行するときに、どのライブラリを
使うかを環境変数 LD_LIBRARY_PATH で指定するようです。

違ってたら、ごめんなさい、です。

--
なかむら

y.nakamura

2015年4月15日 22時38分

中村です。

> 違ってたら、ごめんなさい、です。

違っていたようです。

A810のプロダクトマニュアルの126ページの脚注にある
[1]Armadillo-800 シリーズ用の環境では、NEON 対応したlibjpeg turbo が導入されています
ってやつですね。
A840にも同様の記述がありました。

で、ATDE5を調べてみると

atmark@atde5:~$ dpkg -S /usr/arm-linux-gnueabihf/lib/libjpeg.so.8.0.2
libjpeg-turbo8-armhf-cross による退避 (divert) 元: /usr/arm-linux-gnueabihf/lib/libjpeg.so.8.0.2
libjpeg-turbo8-armhf-cross による退避 (divert) 先: /usr/arm-linux-gnueabihf/lib/libjpeg-divert/libjpeg.so.8.0.2
libjpeg-turbo8-armhf-cross: /usr/arm-linux-gnueabihf/lib/libjpeg.so.8.0.2

atmark@atde5:~$ dpkg -L libjpeg-turbo8-armhf-cross
/.
/usr
/usr/arm-linux-gnueabihf
/usr/arm-linux-gnueabihf/lib
/usr/arm-linux-gnueabihf/lib/vfp
/usr/arm-linux-gnueabihf/lib/vfp/neon
/usr/arm-linux-gnueabihf/lib/vfp/neon/libjpeg.so.8.0.2
/usr/arm-linux-gnueabihf/lib/libjpeg.so.8.0.2
ほかのパッケージの同名ファイルは次の名前に退避した: /usr/arm-linux-gnueabihf/lib/libjpeg-divert/libjpeg.so.8.0.2
/usr/share
/usr/share/doc
/usr/share/doc/libjpeg-turbo8-armhf-cross
/usr/share/doc/libjpeg-turbo8-armhf-cross/README
/usr/arm-linux-gnueabihf/lib/vfp/neon/libjpeg.so.8
/usr/arm-linux-gnueabihf/lib/libjpeg.so.8
ほかのパッケージの同名ファイルは次の名前に退避した: /usr/arm-linux-gnueabihf/lib/libjpeg-divert/libjpeg.so.8

となっていて、/usr/arm-linux-gnueabihf/lib/libjpeg.so.8.0.2が
libjpeg-turboのようです。
ようするに、普通に-ljepgとやれば、libjpeg turboが使われる、
ということではないかと。

それから、libturbojpegというのもATDE5にクロスで入っていますが、
これはjpeg-turboとは別モノかな?と思います。

atmark@atde5:~$ dpkg -S /usr/arm-linux-gnueabihf/lib/libturbojpeg.so
libturbojpeg-armhf-cross: /usr/arm-linux-gnueabihf/lib/libturbojpeg.so

atmark@atde5:~$ apt-cache show libturbojpeg-armhf-cross
Package: libturbojpeg-armhf-cross
Version: 1.2.0-1atmark1
Architecture: all
Maintainer: Debian TigerVNC Packaging Team
Source: libjpeg-turbo
Provides: libturbojpeg-armhf-dcv1
Depends: multiarch-support-armhf-cross, libc6-armhf-cross (>= 2.13-28)
Priority: extra
Section: libs
Filename: pool/main/libj/libjpeg-turbo/libturbojpeg-armhf-cross_1.2.0-1atmark1_all.deb
(途中省略)
This package was generated by dpkg-cross for cross compiling.
.
This is based on the libjpeg-turbo and not on the IJG JPEG.
.
This provides runtime library supporting the Independent JPEG
Group's standard for JPEG files.
.
This package contains the libturbojpeg.so library, used by
turboVNC and other users of the past TurboJPEG library.

別モノだよ、という説明ページ
"libjpeg-turbo" != "TurboJPEG"
http://www.libjpeg-turbo.org/About/TurboJPEG

--
なかむら

at_hanada

2015年4月16日 0時06分

花田です。

中村さんありがとうございます、基本的にご説明通りですm(__)m

(若干不正確なところも含みますが)現時点での必要な情報だけばっさり書くと。

libturbojpeg ← 独自APIを持つ高速JPEG圧縮ライブラリ
↓ 同じソースから派生して生成
libjpeg-turbo ← libjpeg8と同一のAPIを持つ高速JPEG圧縮ライブラリ

という形です。
それでもって、ATDE5では(libjpeg8を置換して)libjpeg-turboの環境がインストールされているため、何も考えずにlibjpeg8対応のプログラムを書いてビルドすればAtmark-DIstによってlibjpeg-turboのライブラリがイメージに同梱されます。

(細かくいえば、開発環境にlibjpeg-turbo8なんて入っていなくても、本家libjpeg8のヘッダを利用して共有ライブラリにリンクされるようにアプリを作成して、Armadillo上にlibjpeg-turbo共有ライブラリとともに持っていくだけでもlibjpeg-turoboで動作するはずです)

y.nakamura

2015年4月16日 0時50分

中村です。

花田さん、解説ありがとうございます。

> libturbojpeg ← 独自APIを持つ高速JPEG圧縮ライブラリ
> ↓ 同じソースから派生して生成
> libjpeg-turbo ← libjpeg8と同一のAPIを持つ高速JPEG圧縮ライブラリ
....
> (細かくいえば、開発環境にlibjpeg-turbo8なんて入っていなくても、本家libjpeg8のヘッダを利用して共有ライブラリにリンクされるようにアプリを作成して、Armadillo上にlibjpeg-turbo共有ライブラリとともに持っていくだけでもlibjpeg-turoboで動作するはずです)

先ほどの「違ってました」の投稿の前に、オリジナルソースを取得して、
クロスコンパイルしてみました。
クロスのオプションだけつけてコンパイルすると、libjpeg6(62だったかな?)と
libturbojpegの2つが出来上がり、libjpegのヘッダやドキュメントなども
本来のlibjpegと同じものみたいでしたので、ここで、同名のライブラリで
置き換えるだけ、と、気づきました。

「違ってました」の前に書いた、 LD_LIBRARY_PATHで切り替える、
というのは、ぐぐったいくつかのサイトに書いてあったものですが、
これはオリジナルlibjpegとは別なところにturbo版のlibjpegを入れておいて、
それを切り替えて使うため、ということも、ここで気づいた次第です。

それから、クロスビルドしたときにlibjpeg6ができあがってしまっていましたが、
READMEあたりにv8エミュレーションのことが書いてあったので、
--with-jpeg8をつけてみたところ、libjpeg8ができあがりました。

このあとATDE5(atmark-distの環境)ではどうなっているの?と調べた手順が、
1つ前の投稿です。

--
なかむら

tanaka.kenji

2015年4月16日 9時26分

中村様、花田様

田中です。ご回答ありがとうございました。
普通にlibjpegで使用できるということで了解です。
詳細なご説明ありがとうございます。

せっかくなので追加で教えていただきたいのですが、
Armadillo上でOpenCVのcvSaveImageでJPEG保存する場合も
最終的にはlibjpeg-turboが使用されているのでしょうか?

OpenCVとlibjpeg(turbo)を使用時のJPEG圧縮(保存)時間を計測したのですが、
どちらも同程度でした。

at_hanada

2015年4月16日 13時57分

花田です。

> Armadillo上でOpenCVのcvSaveImageでJPEG保存する場合も
> 最終的にはlibjpeg-turboが使用されているのでしょうか?

そうなるはずです。

> OpenCVとlibjpeg(turbo)を使用時のJPEG圧縮(保存)時間を計測したのですが、
> どちらも同程度でした。

同じシステムで同じ作り方している以上、同じライブラリが呼ばれるでしょう。
ATDE5で作ったROMイメージベースであれば、libjpeg-turbo版が入っているはず。

Armadillo上のlibjpeg.so.8.0.2を

> ほかのパッケージの同名ファイルは次の名前に退避した: /usr/arm-linux-gnueabihf/lib/libjpeg-divert/libjpeg.so.8.0.2

こっちに入れ替えると、遅くなることは確認できると思います(^^;

tanaka.kenji

2015年4月16日 14時13分

田中です。

了解です。ご回答ありがとうございました。