Cara mengompilasi biner 32-bit pada mesin linux 64-bit dengan gcc / cmake

129

Apakah mungkin untuk mengkompilasi proyek dalam 32-bit dengan cmakedan gccpada sistem 64-bit ? Mungkin memang begitu, tetapi bagaimana saya melakukannya?

Ketika saya mencobanya dengan cara "bodoh", tanpa mengatur parameter / flags / etc, hanya pengaturan LD_LIBRARY_PATHuntuk menemukan perpustakaan yang terhubung di ~/tools/libdalamnya tampaknya mengabaikannya dan hanya melihat di subdirektori bernama lib64 .

dala
sumber
1
Apakah cukup untuk melewatkan flag -m32 ke gcc? Lalu bagaimana saya melakukannya di cmake?
dala

Jawaban:

124
export CFLAGS=-m32
kaf
sumber
2
Seharusnya begitu. Anda juga bisa memodifikasi script cmake untuk membuat target 32 bit - itu hanya akan menambah -m32ke CFLAGS, mungkin oleh pengaturan CMAKE_REQUIRED_FLAGS.
caf
5
Nah, masalahnya adalah ini tentu saja tidak cukup. Anda mungkin perlu mengubah tautannya juga!
lpapp
6
Apa exportartinya Di mana tempatnya? File header? Itu makefile? Tidak, sama sekali bukan jawaban untuk saya sebagai pemula.
Tomáš Zato - Reinstate Monica
1
@ TomášZato: Pada prompt shell, sebelum memanggil cmake(namun dalam kasus Anda, jika Anda memiliki Makefile, maka Anda akan menggunakan makesebagai gantinya).
caf
4
@caf, bisakah Anda menjelaskan jawaban Anda? Jawaban Anda sangat singkat dan tidak menjelaskan apa pun.
Bulat M.
76
$ gcc test.c -o testc
$ file testc
testc: ELF 64-bit LSB yang dapat dieksekusi, x86-64, versi 1 (SYSV), terhubung secara dinamis (menggunakan lib bersama), untuk GNU / Linux 2.6.9, tidak dilucuti
$ 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
$ file testc
testc: ELF 32-bit LSB yang dapat dieksekusi, Intel 80386, versi 1 (SYSV), terhubung secara dinamis (menggunakan lib bersama), untuk GNU / Linux 2.6.9, tidak dilucuti
$ ldd testc
    linux-gate.so.1 => (0x009aa000)
    libc.so.6 => /lib/libc.so.6 (0x00780000)
    /lib/ld-linux.so.2 (0x0075b000)

Singkatnya: gunakan -m32flag untuk mengkompilasi biner 32-bit.

Juga, pastikan bahwa Anda memiliki versi 32-bit dari semua perpustakaan yang diperlukan diinstal (dalam kasus saya semua yang saya butuhkan di Fedora adalah glibc-devel.i386)

andri
sumber
1
Terima kasih banyak! Ya, saya memiliki dependensi versi 32-bit.
dala
6
Bagaimana saya bisa menginstal versi 32bit perpustakaan?
Tomáš Zato - Reinstate Monica
2
@ TomášZatosudo apt-get install gcc-multilib
Matthew Murdoch
16

Dalam versi CMake selanjutnya, satu cara untuk melakukannya pada setiap target adalah:

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

Saya tidak tahu cara melakukannya secara global.

Nathan Monteleone
sumber
+1. Saya mencoba membuat taglib 32-bit ( developer.kde.org/~wheeler/taglib.html ) di atas macan tutul salju 64-bit. Ini bekerja untuk saya.
edwardw
3
… Untuk melakukannya secara global:cmake -D CMAKE_CXX_FLAGS=-m32 . && make
dyomas
7

Untuk C ++, Anda bisa melakukan:

export CXXFLAGS=-m32

Ini bekerja dengan cmake.

eucas
sumber
6

Salah satu caranya adalah dengan mengatur lingkungan chroot. Debian memiliki sejumlah alat untuk itu, misalnya debootstrap

Dirk Eddelbuettel
sumber
2
Terasa agak ekstrem untuk menyiapkan lingkungan chroot hanya untuk membangun aplikasi 32-bit, bukan? Adakah alasan khusus mengapa Anda merekomendasikan hal itu?
Fredrik
3
Ini memberi Anda lingkungan yang lengkap untuk menjalankan kode. Kami menggunakannya untuk membangun (dan menjalankan) binari 32 bit penuh pada host 64 bit - terkadang Anda hanya mendapatkan 32 bit pustaka pihak ketiga. Untuk pekerjaan Debian, kami menggunakannya untuk membangun paket 32 ​​bit pada host 64 bit.
Dirk Eddelbuettel
Saya tidak pernah mengalami masalah apa pun yang pernah membangun dan menjalankan binari 32-bit penuh di linux, Solaris atau platform 64-bit lainnya. Tapi saya tidak banyak menggunakan Debian.
Fredrik
Frederik, apakah Anda juga menyebarkannya dalam 32 bit pada host 64 bit?
Dirk Eddelbuettel
@ Simp: biner 32 bit bekerja pada mesin 32 dan 64 bit (tentu saja), biner 64 bit hanya bekerja pada mesin 64 bit. Tidak masalah apakah itu adalah mesin pelanggan atau host build. Sejujurnya saya tidak melihat di mana masalahnya kecuali modul kernel yang Anda bangun.
Fredrik
6

Untuk aplikasi yang kompleks, saya sarankan untuk menggunakan wadah lxc . Wadah lxc adalah 'sesuatu di tengah-tengah antara chroot steroid dan mesin virtual lengkap'.

Sebagai contoh, inilah cara untuk membuat anggur 32-bit menggunakan lxc pada sistem Ubuntu Trusty:

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

Berikut adalah halaman wiki tentang cara membuat anggur 32-bit pada host 64-bit menggunakan lxc .

Sam Watkins
sumber
menarik. Bisakah saya menggunakannya untuk mengkompilasi atomeditor teks untuk 32bit di mesin 64bit?
Anwar
1
@ Anwar, saya kira begitu. Itu harus bekerja untuk membangun apa pun.
Sam Watkins