[Armadillo:09258] Re: Armadillo-810でOpenCVのサンプルをコンパイル時のエラーに関して

Makoto Harada email@hidden
2013年 10月 14日 (月) 18:39:04 JST


原田です。

> 
> ●実行
> SDカードにsample_convertを書き込んで、Amrmadillo-810をSDカードから起動して
> 実行すると以下のメッセージが表示されます。
> ./sample_convert: error while loading shared libraries: libopencv_core.so.2.
> 3: cannot open shared object file: No such file or directory
> 
> lddで確認すると確かに、共有ライブラリを参照しています。
> # ldd ./sample_convert
>        libopencv_core.so.2.3 => not found
>        libopencv_highgui.so.2.3 => not found
>        libopencv_imgproc.so.2.3 => not found
>        libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0xb6eea000)
>        libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6e05000)
>        /lib/ld-linux-armhf.so.3 (0xb6f5a000)

ご推察の通り、こちらはターゲットのルートファイルシステムに必要なライブラリが入っていない為に起きている問題です。

a810では以下の2種類のルートファイルシステムが使用できます。
- Atmark Dist (例:romfs.img.gz, omfs-a810-v1.02.img.gz)
- Debian GNU/Linux (例:debian-wheezy-armhf_a810_20130116.tar.gz) 

ルートファイルシステムの詳細に関して製品マニュアルをご覧ください。
http://manual.atmark-techno.com/armadillo-810/armadillo-810_product_manual_ja-1.2.0/

>   http://armadillo.atmark-techno.com/howto/armadillo-810-opencv
本Howtoでは、ルートファイルシステムにAtmark Distユーザーランドイメージを使用しています。
Howtoに記載されている手順通り、Atmark Distへ組み込んだ上でアプリケーションをクロスコンパイルすると、
Atmark Distは、そのアプリケーションにリンクされるライブラリを、ATDEのクロスライブラリ(例: /usr/arm-linux-gnueabihf) 
よりユーザーランドに自動的にコピーしてくれます。したがって、Atmark Distユーザーランドイメージ(atmark-dist/images/
romfs.img.gz)を使用すれば確実にライブラリが存在するよう設計されています。


今回のように、ルートファイルシステムにdebianを使用する場合は、
gccをダウンロードして、セルフコンパイル環境を構築する方法がよいかと思います。

    #gcc, makeをダウンロード
   [debian:~]# apt-get install gcc make 

    # opencv 開発用ライブラリをダウンロード
     [debian:~]# apt-get install libopencv-dev libopencv-core-dev libopencv-highgui-dev libopencv-imgproc-dev

    # コンパイル
     Makefile, sample_convert.c を作成
     [debian:~]# make

尚、a810のカメラモデル開発セットでは、有線LANや無線LANといったネットワークがありませんので、
市販のUSB-Ether変換アダプタや、ATB-A810LAN, ATB-A810WLANといったネットワーク対応拡張ボードを
利用する等、a810がネットワークにつながる環境を構築しておく必要がある点ご注意ください。

ネットワーク環境がない場合は、必要なパッケージを一つづつ手動でDebianのパッケージサイトからダウンロードしたり、
ATDEから必要なライブラリをコピーする手もありますが、依存関係によって大変な手間になる可能性が高いです。
特別な理由がない限り、ルートファイルシステムはAtmark Distを用いるのが良いかと思います。

原田

(2013年10月11日 14:23), 大野徹 wrote:
> 大野と申します。
> よろしくお願いします。
> 
> 【ターゲット】Amrmadillo-810
> 【開発環境】
>   VMWare Player上でATDE5(32bit版)を構築
>   クロスコンパイラ arm-linux-gnueabihf-gcc-4.6
> 【動作環境】
>   以下のファイルをSDカードに書き込んでSDカードからブート
>   ブートローダ:loader-armadillo810-mmcsd-v3.2.3.bin
>   ユーザランド:debian-wheezy-armhf_a810_20130116.tar.gz
>   カーネル:linux-a810-v1.04.bin.gz
> 【確認状況】
>   正常にSDカードからブートできています。
>   自作の簡単なサンプルをATDE5上でクロスコンパイル後、SDカードにコピーして
>   Amrmadillo-810を起動後、問題なく動作しています。
> 
> 【やりたいこと、及び問題点】
>   http://armadillo.atmark-techno.com/howto/armadillo-810-opencv
> 上記のOpenCVサンプルをAmrmadillo-810で実行して正常動作することを確認したいの
> ですが、以下の問題が発生しています。
> 
> (1)サンプルのMakefileだと共有ライブラリ(*.so)がリンクされてしまう
> ホームページのMakefileを(下記)を元にビルドするとWarningが出ますが、実行
> ファイルが生成されます。
> ---------- ホームページを元に作成したMakefile -------------
> CC = arm-linux-gnueabihf-gcc-4.6	# CrossCompiler
> 
> EXEC = sample_convert
> OBJS = sample_convert.o
> LDFLAGS := -lopencv_core -lopencv_highgui -lopencv_imgproc -lm
> LDLIBS = -L"/usr/arm-linux-gnueabihf/lib"
> 
> all: $(EXEC)
> 
> $(EXEC): $(OBJS)
> 	$(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)
> 
> romfs:
> 	$(ROMFSINST) /usr/bin/$(EXEC)
> 
> clean:
> ---------------------------------------------------------------
> 
> ----------- ビルド時のWarning --------------------------------------
> arm-linux-gnueabihf-gcc-4.6	    -c -o sample_convert.o sample_convert.c
> arm-linux-gnueabihf-gcc-4.6	 -lopencv_core -lopencv_highgui
> -lopencv_imgproc -lm -o sample_convert sample_convert.o
> -L"/usr/arm-linux-gnueabihf/lib"
> /usr/lib/gcc/arm-linux-gnueabihf/4.6/../../../../arm-linux-gnueabihf/bin/ld:
> warning: ld-linux.so.3, needed by
> /usr/arm-linux-gnueabihf/lib/libpng12.so.0, not found (try using -rpath or
> -rpath-link)
> ---------------------------------------------------------------------
> 
> ●実行
> SDカードにsample_convertを書き込んで、Amrmadillo-810をSDカードから起動して
> 実行すると以下のメッセージが表示されます。
> ./sample_convert: error while loading shared libraries: libopencv_core.so.2.
> 3: cannot open shared object file: No such file or directory
> 
> lddで確認すると確かに、共有ライブラリを参照しています。
> # ldd ./sample_convert
>          libopencv_core.so.2.3 => not found
>          libopencv_highgui.so.2.3 => not found
>          libopencv_imgproc.so.2.3 => not found
>          libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0xb6eea000)
>          libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6e05000)
>          /lib/ld-linux-armhf.so.3 (0xb6f5a000)
> 
> (2)静的ライブラリをリンクしてのビルドでエラー
> 共有ライブラリがないと動作しないので、静的ライブラリをリンクするように
> Makefileを修正しました。
> 
> ---------------- 修正後のMakefile --------------------
> CC = arm-linux-gnueabihf-gcc-4.6	# CrossCompiler
> 
> EXEC = sample_convert
> OBJS = sample_convert.o
> LIB = /usr/arm-linux-gnueabihf/lib
> 
> all: $(EXEC)
> 
> $(EXEC): $(OBJS)
> 	$(CC) -o $@ $(OBJS) $(LIB)/libopencv_core.a
> $(LIB)/libopencv_highgui.a $(LIB)/libopencv_imgproc.a $(LIB)/libm.a
> 
> romfs:
> 	$(ROMFSINST) /usr/bin/$(EXEC)
> 
> clean:
> ------------------------------------------------------
> 
> makeを実行すると以下のエラーとなります。
> /usr/arm-linux-gnueabihf/lib/libopencv_core.a(persistence.o): In function
> `icvDoubleToString(char*, double)':
> (.text._ZL17icvDoubleToStringPcd+0x1c): undefined reference to `lrint'
> /usr/arm-linux-gnueabihf/lib/libopencv_core.a(persistence.o): In function
> `icvPuts(CvFileStorage*, char const*)':
> (.text._ZL7icvPutsP13CvFileStoragePKc+0x1c): undefined reference to `gzputs'
> /usr/arm-linux-gnueabihf/lib/libopencv_core.a(persistence.o): In function
> `icvPuts(CvFileStorage*, char const*)':
>>> undefined referenceとなっているのでライブラリ?が足らないのようにも見えます
> が何が不足しているのでしゅうか?
> 
> お手数ですがよろしくお願いします。
> 
> 
> 
> _______________________________________________
> armadillo mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
> 




armadillo メーリングリストの案内