64 bit Ubuntu'da 32 bit uygulama oluşturma


23

Saatlerce süren yorulmadan sonra pes etmeye ve uzmanlara sormaya karar veriyorum. 64 Ubuntu 11.10'umda 32 bitlik bir uygulama (ilgilenen varsa xgap) oluşturmaya çalışıyorum. I ilave CFLAGS = -m32 ve LDFLAGS = -L / usr / lib32 makefile. Nesneler 32 bit para cezası içine yerleştirilmiştir. Son adım, X pencerelerinin tüm nesnelerini ve kitaplıklarını bu çalıştırılabilir --- xgap'a bağlamaktır. Her nasılsa bana bu hatayı veriyor:

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
...

Ben yüklemiş ia32-kütüphanelerini ve mutilib destek . Sanırım linkeri bir i386 çıktısı oluşturmaya zorlamam gerekiyor. İki koymak için çalıştı ld : yukarıda gösterildiği gibi benim gcc komutu bayrakları -melf_i386 ve -oformat elf32-i386 . Fakat olan şu ki, gcc artık / usr / lib32 içindeki 32 bit kütüphaneyi aramıyor . Bu bayrakları sabit bir sıraya koymam gerekip gerekmediğini merak ediyorum.

Herhangi bir fikir ve yardım için teşekkürler!

EDIT: Son gcc komutuma -m32 bayrağını eklediğimde (inanıyorum bağlama aşaması), -L / usr / lib32 bayrağını yerinde tutsam bile, gcc artık / usr / lib32 içinde arama yapmıyor (gerçekten garip ...) ve aşağıdaki hatayı oluşturur:

/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

Bunun neden olduğu hakkında fikri olan var mı? Yapılandırmak ve yapmak için otomatik aracı kullanıyorum. Bu komut dosyalarını değiştirmek konusunda gerçekten çok iyiyim.

EIDT : Sorunu çözdüm . Bence gcc statik bir kütüphane arşivi bekliyordu. Bağlantı için gerekli tüm .a arşivlerini indirmek için http://ubuntuforums.org/showthread.php?t=474790 adresindeki getlibs komut dosyasını kullandım . Sonra gcc çalıştı. Bence gcc içinde arama yaptı / usr / lib32 dizinine ama bulamadık .a arşivleri böyledir standart dizinde arama devam etti / usr / lib o uyumsuz bulur .bu * dosyaları.

Ama o zaman soru şudur: ia32-libs paketindeki / usr / lib32 / içerisindeki * .so dosyalarında bağlantı için gerekli kütüphaneler gerçekten yok mu? / Usr / lib32 / içindeki bu dosyalar ne için kullanılıyor?



Yanıtlar:


15

LDFLAGSde içermelidir -m32. Aşağıdaki çalışması gerekir:

export LDFLAGS='-m32 -L/usr/lib32'

Aslında, bir -L/usr/lib32kısmı bırakabilirsiniz , çünkü bu 32bit libs için varsayılan bir dizindir ve sisteminiz bunun farkındadır.

Temel olarak, 64 bit makinede 32 bit uygulama oluşturmanın en basit yolu şudur:

export CFLAGS='-m32'
export CXXFLAGS='-m32'
export LDFLAGS='-m32'
make

.. ya da otomatik araçlar kullanıyorsanız, komut dosyasını yapılandırmak için bu değişkenleri besleyin .

GÜNCELLEŞTİRME:

Statik ve dinamik kitaplıklar ile bağlantı kurmanın farklılıkları hakkında gerçekten bilginiz yok gibi görünüyor. Mümkün olduğunca az olmaya çalışacağım:

  • Hem statik hem de dinamik geliştirme kütüphaneleri aynı dosya uzantısına sahiptir .a
  • Aynı kütüphanenin hem statik hem de dinamik sürümlerini yüklediyseniz, bunlardan birinde libname.adinamik ve libname_s.astatik sürüm için olduğu gibi ek posta eki olabilir .
  • Tabii ki, statik ve dinamik kütüphane sürümlerinin boyutları farklıdır. Statik versiyon daha ağır.
  • Statik kütüphaneyle bağlanırsanız - uygulamanızın hiçbir bağımlılığı yoktur. Dinamik kütüphaneyle bağlantı kurarsanız, .sosisteminizde bulunması gereken çalışma zamanı kütüphanesine dayanacaktır .

Unutmayın, burada DSO'ların dlopen () / dlsym () API'sini kullanarak açık bir şekilde yüklenmesi gibi gelişmiş numaralardan bahsetmiyoruz.


Şimdi kurulumumda bir sorun olduğunu düşünüyorum. -M32'yi son gcc komutuma eklediğimde, bunun yerine / usr / lib klasörünü arar. -M32 eklemezsem ve -L / usr / lib32 bayrağını kullanırsam, doğru dizinde arama yapar ancak yukarıdaki hataları üretir. Buna neyin sebep olabileceğini biliyor musun?
— Rich,

Ve her ikisini de birleştirirseniz ne olacak (yukarıdaki örneğindeki gibi)?
— Andrejs Cainikovs

her ikisini de birleştirirsem, hala / usr / lib32 içinde arama yapmaz. sadece / usr / lib içinde arama yapar. Ve btw, otomatik araçlar kullanıyorum.
— Zengin

Garip .. -l/usr/lib32/libXaw.soBunun yerine beslenmeyi denediniz mi?
— Andrejs Cainikovs,

Onları bulamıyor ....: 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’yu bulamıyor
— Zengin

9

Gibi hatalar alıyordum:

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libstdc++.so when searching for -lstdc++

Bu benim için düzeltti:

sudo apt-get install g++-multilib

Varsayılandan farklı bir gcc paketi kullanıyorsanız (örn. gcc-7), o zaman bu özel sürüm için paketi yüklemeniz gerekir:

sudo apt-get install g++-7-multilib

1
g++-multilibg ++ (C ++) için, ayrıca ihtiyacınız olan gcc (C) için gcc-multilib.
— pevik
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.