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


23

数時間のグーグルの後、私はあきらめて専門家に尋ねることにしました。私の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-libsmutilibサポートをインストールしました。リンカにi386出力を生成させるだけでよいと思います。上記のように、gccコマンドに-melf_i386-oformat elf32-i386の 2つのldフラグを追加しようとしました。しかし、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は静的ライブラリアーカイブを期待していたと思います。http://ubuntuforums.org/showthread.php?t=474790getlibsスクリプトを使用して、リンクに必要なすべての.aアーカイブをダウンロードしました。その後、gccが機能しました。私が思うにgccがで検索をしたの/ usr / lib32がディレクトリが、見つけられませんでし た.aそうである標準ディレクトリで検索するように行ったアーカイブをは/ usr / libにそれは互換性のない見つけ、* .soのファイルを。

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



回答:


15

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の明示的なロードなど、高度なトリックについては説明していません。


今、私は私のセットアップに何か問題があると思います。最後のgccコマンドに-m32を追加すると、代わりに/ usr / libフォルダーが検索されます。-m32を追加せずに-L / usr / lib32フラグを使用すると、正しいディレクトリが検索されますが、上記のエラーが生成されます。これを引き起こす原因を知っていますか?
リッチ

そして、両方を組み合わせるとどうなりますか(上記の私の例のように)?
アンドレイスカイニコフス

両方を組み合わせても、まだ/ usr / lib32を検索しません。/ usr / libを検索するだけです。ところで、私は自動ツールを使用しています。
リッチ

奇妙な.. -l/usr/lib32/libXaw.so代わりに餌をやりましたか?
アンドレイスカイニコフス

それらを見つけることができません....:gcc -o xgap xcmds.o utils.o gapgraph.o gaptext.o pty.o popdial.o xgap.o selfile.o -O2 -L / usr / lib32 -l / usr / lib32 / libXaw.so -l / usr / lib32 / libXmu.so -l / usr / lib32 / libXt.so -l / usr / lib32 / libXext.so -l / usr / lib32 / libX11.so -l / USR / lib32が/ libSM.so -lは/ usr / lib32が/ libICE.so -m32は/ usr / binに/ LD:-lは/ usr / lib32が/ libXaw.so見つけることができません
リッチ

9

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

/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

1
g++-multilibg ++(C ++)の場合、gcc(C)の場合も必要gcc-multilibです。
-pevik
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.