
Ubuntu日本語フォーラム
ログインしていません。
はじめまして。fatcatと申します。
BeagleBoard上でXlibを使用し、DIBファイルを読み込み表示するための
簡単なソフトを作成しております。
現在は以下の2つの環境がございます。
A.デスクトップPCにてUbuntu起動
B.SDカードにUbuntuを配置し、BeagleBoardで起動
いずれも開発はAの環境で行い、
A用のソフトはGCCのネイティブコンパイラを使用
B用のソフトはCodeSourceryG++_Liteのarm-none-linux-gnueabi-gccのクロスコンパイラを使用
という状態です。
Aの環境ではGCCコンパイラを用いて、ソフトを生成し、実際に動いております。
Bの環境でのコンパイルで詰まっております。
同じソースコードのままでコンパイラをGCCからarm-none-linux-gnueabi-gccに
変更しただけでは
以下のワーニングおよびエラーがでます。
make実行時の出力情報
arm-none-linux-gnueabi-gcc -L/usr/X11R6/lib -I/usr/include -o dispimage dispimage.c -lX11
cc1: warning: include location "/usr/include" is unsafe for cross-compilation
/home/fatcat/CodeSourcery/Sourcery_G++_Lite/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/../../../../arm-none-linux-gnueabi/bin/ld: warning: library search path "/usr/X11R6/lib" is unsafe for cross-compilation
/home/fatcat/CodeSourcery/Sourcery_G++_Lite/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/../../../../arm-none-linux-gnueabi/bin/ld: cannot find -lX11
collect2: ld returned 1 exit status
make: *** [dispimage] エラー 1
ワーニングの内容はネイティブ環境用のXlib関連のヘッダファイルを利用しているので
クロス環境ではダメというくらいの認識です。
エラーについては、わかっておりません。
Xlibを使用したクロス環境でのソフト開発方法をご存知の方いらっしゃれば
よろしくお願いいたします。
オフライン
MakefileあたりにXLIBDIRがあれば
XLIBDIR = -L/hoge/
と、XLIBDIRがなければ-L指定をかけられる箇所で同じ右辺を導入してあげれば良いかなぁと思います(hogeの部分は実際にxlibがある場所を指定)。
ただ、クロスコンパイル環境の手引きでchrootしないといけない等のフォローはないでしょうか? なんとなくマニュアルにはそうしたフォローがあるのではないかと思います。
また、どうしてもBの方法のクロス環境を使いたいのでなければ、
http://people.canonical.com/~ogra/arm/build-arm-rootfs
https://wiki.ubuntu.com/ARM/BuildEABIChroot
あたりの、QEMUを使ったVirtualなARM環境を作る手法の方が余計なことを気にせずに済みそうです。
オフライン
hitoさん、お返事ありがとうございます。
現在のMakefileは以下のとおりです。
arm-none-linux-gnueabi-gcc -L/usr/X11R6/lib -I/usr/include -o dispimage dispimage.c -lX11
ですので、XLIBDIRはない状態かと思っております。
ただこのMakeFile自体も自作したものなので、クロス環境用に必要なものが抜けている可能性は十分にございます。
-Lで環境BのSDカードに配置したXlibのパスを設定して、試してみます。
chrootについては、まだよくわかっておりませんので少し調査いたします。
今やっていることのゴールは環境Bにてソフトを起動させることなので、Virtual環境でなく実環境を目指したいと思っております。
オフライン
私がhitoさんのおっしゃっていることを勘違いしているかもしれませんが、先ほど教えていただいたように-L指定にXlibがあるパス(-L/home/fatcat/ubuntu/usr/X11R6/lib)を設定しましたが、以下のようなエラーがでております。
(/home/ubuntuディレクトリ以下にSDカード内に配置したファイルシステム一式をコピーしております。)
Makefileは以下のとおりです。
arm-none-linux-gnueabi-gcc -L/home/fatcat/ubuntu/usr/X11R6/lib -I/usr/include -o dispimage dispimage.c -lX11
出力
cc1: warning: include location "/usr/include" is unsafe for cross-compilation
/home/fatcat/CodeSourcery/Sourcery_G++_Lite/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/../../../../arm-none-linux-gnueabi/bin/ld: cannot find -lX11
collect2: ld returned 1 exit status
make: *** [dispimage] エラー 1
実際にBeagleBoardではXWindowが動いている(GUIで表示されている)ので、Xlibを利用して表示しているとは思っているのですが
いざ自作のソフト開発となるとうまくいっておりません。
引き続きアドバイスいただければ、大変ありがたく思います。
オフライン
実際にBeagleboard環境を持っていないのでアレな感じですが、
-L/home/fatcat/ubuntu/usr/X11R6/lib
と指定しているこのディレクトリに、libX11.soのたぐいはありますか?(CHROOT/usr/X11R6/libではなくCHROOT/usr/lib/の下にあったりしないでしょうか? /usr/X11R6/libが../libのsymlinkになっている?)
あと個人的には、クロスコンパイル時に-I/usr/includeするのは大変危険な感じじゃないかなぁと思います。これも/home/fatcat/ubuntu/usr/includeに差し替えておいた方がよさそうです。
オフライン
ご返信ありがとうございます。
ご質問いただいた
>>-L/home/fatcat/ubuntu/usr/X11R6/lib
>>と指定しているこのディレクトリに、libX11.soのたぐいはありますか?
ですが
大変申し訳ございません。今確認しましたところ、home/fatcat/ubuntu/usr/X11R6ディレクトリ以下にはbinディレクトリのみでした。そのbinディレクトリ(フォルダへのリンクとなっており、リンク先は../bin が指定されております)以下にはさまざまなファイルやディレクトリがありました(home/fatcat/ubuntu/usr/binディレクトリと同じ内容?)。
またhome/fatcat/ubuntu/usr/の下にもlibX11.soファイルは見つかりませんでした。
また、home/fatcat/ubuntu/usr/libディレクトリいかにもlibX11.soの類はありませんでした。
ご指摘いただいてからいうのもおこがましいですが、クロスコンパイル時に-I/usr/includeより、/home/fatcat/ubuntu/usr/includeのほうが安全だと思いますので、すぐに修正いたします。
今hitoさんに教えていただいた内容を調べているうちに気づいたのですが、-I指定しているディレクトリ(/home/fatcat/ubuntu/usr/include)以下のX11ディレクトリにあるヘッダファイル(Xlib.hとXutil.h)をインクルードしておりまして、そのファイルが見当たりません。
ということは、私がUbuntuのルートファイルシステムを作成したときに、Xlib関連のヘッダファイルおよびライブラリが含まれていなかったということになるのでしょうか?
もしそうであれば、Xlib関連のヘッダファイルおよびライブラリが含まれているルーとファイルシステムを生成して再度SDカードに配置した上で、上記ご指摘いただいたパスにてmakeすべきということになるのでしょうか?
よろしくお願いいたします。
オフライン
もしそうであれば、Xlib関連のヘッダファイルおよびライブラリが含まれているルーと
ファイルシステムを生成して再度SDカードに配置した上で、上記ご指摘いただいたパス
にてmakeすべきということになるのでしょうか?
おそらくそうだと思います。SDカード側の環境に、libx11-devパッケージが入っていないのだろう、という挙動に見えます。ただ、おそらくBeagleboardということは9.04かと思うのですが、9.04の場合は/usr/lib/をリンク指定してください。libx11-devがあっても/usr/X11R6/lib/はありません。
BeagleboardにSDカードを挿して起動し、sudo apt-get install libx11-dev すればヘッダファイル・ライブラリともにそろうはずで、その状態であればクロスコンパイルは通るかなぁという感じです。
オフライン
Ubuntuは、おっしゃるとおり9.04です。記述が抜けており申し訳ございません。
上記の件、了解しました。ありがとうございます。
今はUSB-Eth変換機がないのですぐにlibx-devをインストールすることはできませんが
USB-Eth変換機が用意できrばBeagleBoardにSDカードを挿して、sudo apt-get install libx-devを行い、そのSDカードを作業用PCに挿した状態でクロスコンパイルを行ってみます。
オフライン
返事が遅くなりまして申し訳ございません。
USB-Eth変換器を入手し、BeagleboardにSDカードを挿して起動し、sudo apt-get install libx11-devを行い、必要なヘッダファイルおよびライブラリを入手できました。
まことにありがとうございます。
入手したヘッダファイルおよびライブラリを以下のように作業用PCにコピーしました。
SDカードの/usr/lib------->作業用PCの/home/fatcat/ubuntu/usr/lib
SDカードの/usr/include--->作業用PCの/home/fatcat/ubuntu/usr/include
この状態でMakefileで使用するライブラリのパスおよびヘッダのインクルードディレクトリを指定したのですが、新たな問題が発生しました。
どうやら/lib/libc.so.6が見つからないようです。
libc.so.6のリンク先がlibc-2.9.soに設定されていたため、SDカードから両ファイルを作業用PCの/home/fatcat/ubuntu/usr/includeにコピーし、再度makeしたのですが変わらず/lib/libc.so.6が見つからないということになっております。
たびたびで申し訳ございませんが、何卒よろしくお願いいたします。
#Makefile
dispimage:dispimage.c
arm-none-linux-gnueabi-gcc -L/home/fatcat/ubuntu/usr/lib -I/home/fatcat/ubuntu/usr/include -o dispimage dispimage.c -lX11
make実行時の出力情報
/home/fatcat/CodeSourcery/Sourcery_G++_Lite/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/../../../../arm-none-linux-gnueabi/bin/ld: skipping incompatible /lib/libc.so.6 when searching for /lib/libc.so.6
/home/fatcat/CodeSourcery/Sourcery_G++_Lite/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/../../../../arm-none-linux-gnueabi/bin/ld: cannot find /lib/libc.so.6
collect2: ld returned 1 exit status
make: *** [dispimage] エラー 1
オフライン
/home/fatcat/CodeSourcery/Sourcery_G++_Lite/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/../../../../arm-none-linux-gnueabi/bin/ld: skipping incompatible /lib/libc.so.6
ということなので、クロスコンパイル用に用意しているlibファイル群が「skipping incompatible」で弾かれています。x86用バイナリが生成されていたりしないでしょうか。
hello world的なものを書いてarm-none-linux-gnueabi-gccでコンパイルしてみて、fileすると、実際に生成されているファイルが何なのかが見えるようなと思ったのですが、libcが見えないかぎりそれもできないですね。Code Sourceryのマニュアルにはこうした指定はかかれていないでしょうか。
とりあえず引数に-march=armあたりを足すとどうなりますか?
オフライン
はじめまして、当方でも全く同じ現象に遭遇しています。
奇妙なことに、Socket をアクセスするだけのコンソールベースのアプリケーションだと当該現象が発生しません。
file すると、
socket_example.arm.o: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.14, not stripped
と出てきます。
また、このコードを Windows 上の Code Sourcery でコンパイルするとエラー無く通り、
Cygwin 上で file した結果は以下のようになります。
a.out: ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.6.14, d
ynamically linked (uses shared libs), not stripped
X11 の使用を含むコードを Code Sourcery でコンパイルすると
c:/program files/codesourcery/sourcery g++ lite/bin/../lib/gcc/arm-none-linux-gn
ueabi/4.3.3/../../../../arm-none-linux-gnueabi/bin/ld.exe: cannot find /lib/libc
.so.6
collect2: ld returned 1 exit status
となり、確かに libc の参照を解決できていないことが分かります。
オフライン