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.