質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

ビルド

ソースコードを単体で実行可能なソフトウェアへ変換する過程をビルド(build)と呼びます

Q&A

解決済

1回答

10777閲覧

共有ライブラリのバージョン依存問題を解決したい

退会済みユーザー

退会済みユーザー

総合スコア0

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

ビルド

ソースコードを単体で実行可能なソフトウェアへ変換する過程をビルド(build)と呼びます

0グッド

0クリップ

投稿2015/05/28 02:07

Qtをソースからビルドしてみたところ、Qtの共有ライブラリが下のような状態になっていて、Qtアプリが起動しませんでした。

root@beaglebone:/tmp# ldd /opt/qt-arm/lib/libQtCore.so
/opt/qt-arm/lib/libQtCore.so: /lib/arm-linux-gnueabihf/libc.so.6: version `GLIBC_2.15' not found (required by /opt/qt-arm/lib/libQtCore.so)
libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0xb6c53000)
: : : : :
libgcc_s.so.1 => /lib/arm-linux-gnueabihf/libgcc_s.so.1 (0xb6aff000)
libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6a19000)

libc.soとしてGLIBC_2.15を要求しているようですが、そういう理解であっていますよね。
一方、そのlibcの方はというと、

root@beaglebone:# ls -la /lib/arm-linux-gnueabihf/libc.so.6
lrwxrwxrwx 1 root root 12 Feb 22 20:29 /lib/arm-linux-gnueabihf/libc.so.6 -> libc-2.13.so
root@beaglebone:
# file /lib/arm-linux-gnueabihf/libc-2.13.so
/lib/arm-linux-gnueabihf/libc-2.13.so: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked (uses shared libs), BuildID[sha1]=0x56ee5330c584ca115f4e3bbc3e6d58ca34c6aea1, for GNU/Linux 2.6.26, stripped

このようにlibc.so.6の実体であるlibc-2.13.soはバージョン2.13のようです。これは現在のディストリビューション(debian)では既に最新となっていて、これ以上新しいのはapt-getできませんでした。
また、GLIBCを勝手に変更するとシステム自体に問題が出ることがあると聞いたので、GLIBCを2.15に上げるのではなく、libQtCore.so.4が要求するバージョンを2.13以下となるようにしたいです。

とりあえずQtが動くようにする暫定パッチを作りたいのですが、どういう仕組みでQtがGLIBC 2.15を要求しているのかが分かりませんでした。GLIBCの特定のバージョンを要求する方法とはどいうものなのでしょうか?ソースコード中のpragmaやコンパイルオプションで指定するものなのでしょうか?Qtのソースツリーを適当なキーワード(_GLIBC_MINOR_など)でgrepしてみたのですが、そういう記述は見つけられませんでした。

識者の方、アドバイスをお願いします。

ちなみに、Qtソースは4.8.6で、開発ホスト=x86-Ubuntu/ターゲット=arm-linuxでクロスコンパイルしています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

libc.soとしてGLIBC_2.15

という認識に間違いはないと思います。
んー…クロスコンパイルに使っている、glibc (のヘッダ)のバージョンが何かというのが気になります。
私なら、開発ホスト上に、ターゲット用の glibc がどこかに展開されているはずで、そのバージョンを下げてみる…という手段をとることを考えます。詳細まで、すぐに分からないです。ごめんなさい。

投稿2015/05/28 05:32

takotakot

総合スコア1111

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/05/29 00:10

アドバイスありがとうございます。 いただいたコメントを拝見して、はたと思いました。 "Qtが特定のバージョン(以上)を要求している"のではなくて、"開発用ホストでクロスビルドしたときに参照したターゲット用glibcと同じバージョンを、ターゲット側にもインストールしておく必要がある"ということなんですね。勉強になりました。 ご提案いただいた方法(開発ホストのglibcを下げる)ことはまだ試せていませんが、開発ホストに入っていたglibcなどのライブラリをターゲットに転送して、Qtアプリを起動するときだけそのライブラリを参照するようにしたところ、Qtアプリが起動することを確認できました。 ご提案の方法がこれから試してみたいと思います。 ありがとうございました。
takotakot

2015/05/29 00:31

あ、そういえばそういう手がありましたね…私も聞いて思いました(コメントを書いたときは、忘れていました)。 「開発ホストに入っていたglibcなどのライブラリをターゲットに転送」で動くならこれで何の問題もありません。バージョンアップで挙動が変わるライブラリなんかは、この手で対応することがよくありますね。 どのように「開発ホストに入っていたglibcなどのライブラリをターゲットに転送して、Qtアプリを起動するときだけそのライブラリを参照するように」したのかを、お時間があれば記して頂ければ、似たような問題で困った人の助けになるかと思います。(環境変数でいけるケースだったのかな)
退会済みユーザー

退会済みユーザー

2015/05/29 01:50

シェルのプロンプトから一行で LD_LIBRARY_PATH=(転送したライブラリのパス) (起動したいアプリ) [オプション] とすれば、このアプリを起動するときだけ↑のライブラリパスを優先的に探してくれるようです。 間違ってもシェルの環境変数に、export LD_LIBRARY_PATH=(ライブラリパス)とはしないことですね。私は操作ミスでそうなってしまい、ほとんどの基本コマンドがSegmentation faultで落ちるようになってしまい「やっちまった!」と焦りましたが、何の事はないLD_LIBRARY_PATHを解除すれば直りました。 あと、私は怖くって試せませんが、ld.so.cacheを更新するとそれこそ酷いことになりそうですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問