Gcc / cmake ile 64-bit linux makinesinde 32-bit ikili nasıl derlenir


129

O bir projeyi derlemek mümkün mü 32-bit ile cmakeve gccbir üzerinde 64 bit sistemde? Muhtemelen öyledir ama bunu nasıl yapacağım?

Bunu "cahil" bir şekilde denediğimde, herhangi bir parametre / bayrak / vb. Ayarlamadan, sadece LD_LIBRARY_PATHbağlantılı kütüphaneleri bulmayı ayarlamak ~/tools/libonu yok sayıyor ve sadece lib64 adlı alt dizinlere bakıyor gibi görünüyor .


1
-M32 bayrağını gcc'ye geçirmek yeterli olur mu? O zaman bunu cmake'de nasıl yaparım?
dala

Yanıtlar:


124
export CFLAGS=-m32

2
Yapmalı. Ayrıca 32 bit hedef oluşturmak için cmake komut değiştirebilir - sadece eklersiniz -m32için CFLAGSmuhtemelen ayarıyla, CMAKE_REQUIRED_FLAGS.
caf

5
Sorun şu ki, bu elbette yeterli değil. Bağlayıcıyı da ayarlamanız gerekebilir!
lpapp

6
Ne anlama exportgeliyor? Nereye ait? Te başlık dosyaları? makefile? Hayır, yeni başlayanlar olarak benim için kesinlikle bir cevap değil.
Tomáš Zato - Monica'yı eski durumuna getir

1
@ TomášZato: Kabuk isteminde, çağırmadan önce cmake(ancak sizin durumunuzda, bir Makefile dosyanız varsa, makeonun yerine kullanacaksınız ).
caf

4
@caf, cevabınızı detaylandırır mısınız? Cevabınız çok kısa ve hiçbir şeyi açıklamıyor.
Bulat M.

76
$ gcc test.c -o testc
$ dosya testc
testc: ELF 64-bit LSB çalıştırılabilir, x86-64, sürüm 1 (SYSV), dinamik olarak bağlantılı (paylaşılan kütüphaneleri kullanır), GNU / Linux 2.6.9 için, soyulmamış
$ 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
$ dosya testc
testc: ELF 32-bit LSB çalıştırılabilir, Intel 80386, sürüm 1 (SYSV), dinamik olarak bağlantılı (paylaşılan kütüphaneler kullanır), GNU / Linux 2.6.9 için, soyulmamış
$ ldd testc
    linux-gate.so.1 => (0x009aa000)
    libc.so.6 => /lib/libc.so.6 (0x00780000)
    /lib/ld-linux.so.2 (0x0075b000)

Kısaca: -m3232 bitlik bir ikiliyi derlemek için bayrağı kullanın.

Ayrıca, gerekli tüm kitaplıkların 32 bit sürümlerinin kurulu olduğundan emin olun (benim durumumda Fedora'da ihtiyacım olan tek şey glibc-devel.i386 idi)


1
Çok teşekkürler! Evet, bağımlılıkların 32 bit sürümlerine sahibim.
dala

6
Kitaplıkların 32bit sürümlerini nasıl kurabilirim?
Tomáš Zato - Monica'yı eski durumuna getir

2
@ TomášZatosudo apt-get install gcc-multilib
Matthew Murdoch

16

CMake'nin sonraki sürümlerinde, bunu her hedefte yapmanın bir yolu şudur:

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

Bunu küresel olarak yapmanın bir yolunu bilmiyorum.


+1. 64 bitlik bir kar leoparı üzerinde 32 bit taglib ( developer.kde.org/~wheeler/taglib.html ) oluşturmaya çalışıyorum . Bu benim için çalışıyor.
edwardw

3
… Bunu küresel olarak yapmak için:cmake -D CMAKE_CXX_FLAGS=-m32 . && make
dyomas

7

C ++ için şunları yapabilirsiniz:

export CXXFLAGS=-m32

Bu cmake ile çalışır.


6

Bunun bir yolu, bir chroot ortamı kurmaktır. Debian'ın bunun için bir dizi aracı vardır, örneğin debootstrap


2
Sadece 32 bit uygulamalar oluşturmak için bir chroot ortamı kurmak biraz aşırı geliyor, değil mi? Bunu önermenizin belirli bir nedeni var mı?
Fredrik

3
Size kodu çalıştırabileceğiniz eksiksiz bir ortam sağlar. Bunu 64 bitlik ana bilgisayarlarda tam 32 bit ikili dosyalar oluşturmak (ve çalıştırmak) için kullanıyoruz - bazen üçüncü taraf kitaplıklarının yalnızca 32 bit yapılarını elde edersiniz. Debian çalışması için, 64 bitlik ana bilgisayarlarda 32 bitlik paketler oluşturmak için kullanıyoruz.
Dirk Eddelbuettel

Ne linux, Solaris ne de başka herhangi bir 64-bit platformda tam 32-bit ikili dosyalar oluşturma ve çalıştırma konusunda şimdiye kadar hiçbir sorun yaşamadım. Ama Debian'ı pek kullanmıyorum.
Fredrik

Frederik, bunları ayrıca 64 bit yapı ana bilgisayarına 32 bit olarak dağıtıyor musunuz?
Dirk Eddelbuettel

@Dirk: 32 bit ikili dosyalar hem 32 hem de 64 bit makinelerde çalışır (tabii ki), 64 bit ikili dosyalar yalnızca 64 bit makinelerde çalışır. Müşteri makinesi mi yoksa yapı ana bilgisayarı mı olduğu önemli değil. Dürüst olmak gerekirse, inşa ettiğiniz çekirdek modülleri olmadığı sürece sorunun nerede olacağını bilmiyorum.
Fredrik

6

Herhangi bir karmaşık uygulama için bir lxc konteyneri kullanmanızı öneririm . lxc kapsayıcıları, 'steroidler üzerinde bir chroot ile tam teşekküllü bir sanal makine arasında ortada bulunan bir şeydir'.

Örneğin, Ubuntu Trusty sisteminde lxc kullanarak 32 bit şarap oluşturmanın bir yolu:

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

Burada lxc kullanarak 64 bitlik bir sunucuda 32 bit şarabın nasıl oluşturulacağıyla ilgili wiki sayfası var .


ilginç. atom64bit makinede 32bit için metin editörü derlemek için kullanabilir miyim ?
Anwar

1
@Anwar, sanırım öyle. Bir şey inşa etmek için çalışmalı.
Sam Watkins
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.