web-dev-qa-db-ja.com

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

64-bitシステムでcmakeおよびgccを使用して2-bitでプロジェクトをコンパイルすることはできますか?おそらくそうですが、どうすればいいですか?

パラメータやフラグなどを設定せずに「無知」な方法で試してみたときに、LD_LIBRARY_PATHを設定して~/tools/lib内のリンクされたライブラリを見つけると、無視され、lib64

126
dala
export CFLAGS=-m32
121
caf
 $ gcc test.c -o testc 
 $ file testc 
 testc:ELF 64ビットLSB実行可能ファイル、x86-64、バージョン1(SYSV)、動的リンク(共有を使用) libs)、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)

要するに、32ビットバイナリをコンパイルするには-m32フラグを使用します。

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

75
andri

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

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

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

15

C++の場合:

export CXXFLAGS=-m32

これはcmakeで機能します。

7
euccas

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

6

複雑なアプリケーションでは、 lxc container を使用することをお勧めします。 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ビットワインをビルドする方法 に関するWikiページを次に示します。

6
Sam Watkins