gcc / cmakeを使用して64ビットLinuxマシンで32ビットバイナリをコンパイルする方法


129

32ビットでプロジェクトをコンパイルすることは可能ですかcmakeし、gcc上の64ビット・システム?おそらくそうですが、どうすればよいですか?

パラメータ/フラグなどを設定せずに「無知」な方法で試したところ、LD_LIBRARY_PATHリンクされたライブラリを見つけるように設定しただけ~/tools/libでは無視され、名前の付いたサブディレクトリのみが表示されます。 lib64ます


1
フラグ-m32をgccに渡すだけで十分でしょうか?それをcmakeでどのように実行しますか?
dala

回答:


124
export CFLAGS=-m32

2
それはすべきです。cmakeスクリプトを変更して32ビットのターゲットを作成することもできます。これ-m32CFLAGS、おそらく設定によってに追加されるだけですCMAKE_REQUIRED_FLAGS
カフェ、

5
まあ、問題はもちろんこれは必ずしも十分ではないということです。リンカーも調整する必要があるかもしれません!
lpapp 2013年

6
なに export意味ですか?それはどこに属していますか?Teヘッダーファイル?makefile?いいえ、まったく初心者としての答えにはなりません。
トマーシュZato -復活モニカ

1
@TomášZato:シェルプロンプトで、呼び出す前にcmake(ただし、Makefileがある場合は、make代わります)。
カフェ

4
@caf、答えを詳しく説明してください。あなたの答えはとても簡潔で何も説明しません。
Bulat M.

76
$ gcc test.c -o testc
$ファイルtestc
testc:ELF 64ビットLSB実行可能ファイル、x86-64、バージョン1(SYSV)、動的にリンク(共有ライブラリを使用)、GNU / Linux 2.6.9用、ストリップされていない
$ ldd testc 
    linux-vdso.so.1 =>(0x00007fff227ff000)
    libc.so.6 => /lib64/libc.so.6(0x000000391f000000)
    /lib64/ld-linux-x86-64.so.2(0x000000391ec00000)
$ gcc -m32 test.c -o testc
$ファイルtestc
testc:ELF 32ビットLSB実行可能ファイル、Intel 80386、バージョン1(SYSV)、動的にリンク(共有ライブラリを使用)、GNU / Linux 2.6.9用、ストリップされていない
$ ldd testc
    linux-gate.so.1 =>(0x009aa000)
    libc.so.6 => /lib/libc.so.6(0x00780000)
    /lib/ld-linux.so.2(0x0075b000)

つまり、-m32フラグを使用して32ビットのバイナリをコンパイルします。

また、必要なすべてのライブラリの32ビットバージョンがインストールされていることを確認してください(私の場合、Fedoraで必要なのはglibc-devel.i386だけでした)。


1
まことにありがとうございます!はい、依存関係の32ビットバージョンがあります。
dala-

6
32ビットバージョンのライブラリをインストールするにはどうすればよいですか?
トマーシュZato -復活モニカ

2
@TomášZato– sudo apt-get install gcc-multilib
マシューマードック

16

CMakeの新しいバージョンでは、各ターゲットでそれを行う1つの方法は次のとおりです。

set_target_properties(MyTarget PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32")

私はそれをグローバルに行う方法を知りません。


+1。私は64ビットのユキヒョウ上に32ビットのtaglib(developer.kde.org/~wheeler/taglib.html)を構築しようとしています。これでうまくいきます。
edwardw 2011

3
…グローバルに実行するには:cmake -D CMAKE_CXX_FLAGS=-m32 . && make
dyomas

7

C ++の場合、次のことができます。

export CXXFLAGS=-m32

これはcmakeで動作します。


6

1つの方法は、chroot環境をセットアップすることです。Debianにはそのための多くのツールがあります。たとえば、debootstrap


2
32ビットアプリをビルドするためだけにchroot環境をセットアップするのは少し極端に感じませんか?それをお勧めする特別な理由はありますか?
Fredrik、

3
また、コードを実行するための完全な環境を提供します。これを使用して、64ビットホストで完全な32ビットバイナリをビルド(および実行)します。サードパーティライブラリの32ビットビルドしか取得できない場合があります。Debianの作業では、64ビットのホスト上で32ビットのパッケージをビルドするために使用します。
Dirk Eddelbuettel、2009

Linux、Solaris、その他の64ビットプラットフォームのいずれでも、完全な32ビットバイナリをビルドして実行することに問題を経験したことはありません。しかし、私はDebianをあまり使用していません。
フレドリック、

フレデリク、64ビットビルドホストの32ビットにもそれらを展開しますか?
Dirk Eddelbuettel、2009

@Dirk:32ビットバイナリは32ビットと64ビットの両方のマシンで動作します(もちろん)、64ビットバイナリは64ビットマシンでのみ動作します。それが顧客のマシンであるかビルドホストであるかは問題ではありません。正直なところ、ビルドしているカーネルモジュールでない限り、問題がどこにあるかはわかりません。
Fredrik、

6

複雑なアプリケーションの場合は、lxcコンテナーを使用することをお勧めします。lxcコンテナは「ステロイドのchrootと本格的な仮想マシンの中間にあるもの」です。

たとえば、Ubuntu Trustyシステムでlxcを使用して32ビットワインをビルドする方法は次のとおりです。

sudo apt-get install lxc lxc-templates
sudo lxc-create -t ubuntu -n my32bitbox -- --bindhome $LOGNAME -a i386 --release trusty
sudo lxc-start -n my32bitbox
# login as yourself
sudo sh -c "sed s/deb/deb-src/ /etc/apt/sources.list >> /etc/apt/sources.list"
sudo apt-get install devscripts
sudo apt-get build-dep wine1.7
apt-get source wine1.7
cd wine1.7-*
debuild -eDEB_BUILD_OPTIONS="parallel=8" -i -us -uc -b
shutdown -h now   # to exit the container

これは、lxcを使用して64ビットのホストで32ビットのwineを構築する方法についてのwikiページです


面白い。atom64ビットマシンで32ビット用のテキストエディターをコンパイルするために使用できますか?
Anwar

1
@Anwar、そうだと思います。何でも構築できるはずです。
Sam Watkins
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.