web-dev-qa-db-ja.com

64ビットUbuntuでの32ビットアプリの構築

数時間のグーグルの後、私はあきらめて専門家に尋ねることにしました。私の64 Ubuntu 11.10で32ビットアプリケーション(もし興味があるならxgap)を構築しようとしています。メイクファイルにCFLAGS = -m32LDFLAGS = -L/usr/lib32を追加しました。オブジェクトは32ビットの罰金に組み込まれています。最後のステップは、Xウィンドウのすべてのオブジェクトとライブラリをこの実行可能ファイルにリンクすることです--xgap。どういうわけか、それは私にこのエラーを与え続けます:

gcc -o xgap xcmds.o utils.o gapgraph.o gaptext.o pty.o popdial.o xgap.o selfile.o   -L/usr/lib32 -lXaw -lXmu -lXt -lXext -lX11  -lSM -lICE

/usr/bin/ld: skipping incompatible /usr/lib32/libXmu.so when searching for -lXmu
...

/usr/bin/ld: i386 architecture of input file `xcmds.o' is incompatible with i386:x86-64 output
...

ia32-libsおよびmutilib supportをインストールしました。リンカにi386出力を生成させるだけでよいと思います。上記のように、gccコマンドに2つのldフラグを配置しようとしました:-melf_i386および-oformat elf32-i386。しかし、gccは/ usr/lib32で32ビットライブラリを検索しなくなります。これらのフラグを一定の順序で配置する必要があるのだろうか?

アイデアと助けてくれてありがとう!

編集:最後のgccコマンド(リンクステージ)で-m32フラグを追加すると、-L/usr/lib32フラグが設定されていても、gccは/ usr/lib32を検索しません(本当に奇妙な...)そして次のエラーを生成します:

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../libXaw.so when searching for -lXaw
/usr/bin/ld: skipping incompatible /usr/lib/libXaw.so when searching for -lXaw
/usr/bin/ld: cannot find -lXaw
collect2: ld returned 1 exit status

誰もこれがなぜ起こるのか考えていますか?自動ツールを使用して構成と作成を行っています。これらのスクリプトファイルを変更するのが得意です。

EIDT:問題を解決しました。 gccは静的ライブラリアーカイブを期待していたと思います。 getlibsスクリプトを http://ubuntuforums.org/showthread.php?t=474790 から使用して、すべての.aアーカイブをダウンロードしましたリンクに必要です。その後、gccが機能しました。 gcc/ usr/lib32ディレクトリで検索したが、。aアーカイブは見つからなかったと思うそのため、/ usr/libである標準ディレクトリを検索し、互換性のない*。soファイルを見つけました。

しかし、問題は:*。soファイル/ usr/lib32 /パッケージia32-libsリンクに必要なライブラリが実際にないのですか? / usr/lib32 /にあるこれらのファイルは何に使用されますか?

22
Rich

LDFLAGSには-m32も含める必要があります。以下が動作するはずです:

export LDFLAGS='-m32 -L/usr/lib32'

実際、これは-L/usr/lib32部分をドロップできます。これは32ビットライブラリのデフォルトディレクトリであり、システムはそれを認識しているためです。

基本的に、64ビットマシンで32ビットアプリケーションを構築する最も簡単な方法は次のとおりです。

export CFLAGS='-m32'
export CXXFLAGS='-m32'
export LDFLAGS='-m32'
make

..または これらの変数をフィードしてスクリプトを構成します autotoolsを使用している場合。

更新:

静的ライブラリと動的ライブラリとのリンクの違いについて、あなたはあまり馴染みがないようです。私は可能な限り最小限にしようとします:

  • 静的開発ライブラリと動的開発ライブラリの両方のファイル拡張子は同じです.a
  • 同じライブラリの静的バージョンと動的バージョンの両方をインストールした場合、動的バージョンのlibname.aや静的バージョンのlibname_s.aのように、どちらかが追加の接尾辞を持つ場合があります。
  • 確かに、静的および動的ライブラリのバージョンはサイズが異なります。静的バージョンはより重いです。
  • 静的ライブラリとリンクする場合-アプリケーションには依存関係がありません。動的ライブラリとリンクする場合、システムに存在する.soランタイムライブラリに依存します。

ここでは、dlopen()/ dlsym()APIを使用したDSOの明示的なロードなど、高度なトリックについては説明していません。

15

次のようなエラーが表示されました。

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libstdc++.so when searching for -lstdc++

これは私のためにそれを修正しました:

Sudo apt-get install g++-multilib

デフォルト以外のgccパッケージ(たとえば、gcc-7)を使用している場合、その特定のバージョンのパッケージをインストールする必要があります。

Sudo apt-get install g++-7-multilib
7