Membangun aplikasi 32-bit di Ubuntu 64-bit

23

Setelah berjam-jam googling, saya memutuskan untuk menyerah dan bertanya kepada Anda para ahli. Saya mencoba membangun aplikasi 32-bit (xgap kalau ada yang tertarik) di 64 Ubuntu 11.10 saya. Saya menambahkan CFLAGS = -m32 dan LDFLAGS = -L / usr / lib32 di makefile. Benda-benda dibangun menjadi 32 bit baik-baik saja. Langkah terakhir adalah menautkan semua objek dan pustaka untuk X windows ke dalam executable ini --- xgap. Entah bagaimana itu terus memberi saya kesalahan ini:

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

Saya telah menginstal ia32-libs dan dukungan mutilib . Saya pikir saya hanya perlu memaksa linker untuk menghasilkan output i386. Saya mencoba untuk meletakkan dua flag ld di perintah gcc saya seperti yang ditunjukkan di atas: -melf_i386 dan -oformat elf32-i386 . Tetapi yang terjadi adalah gcc tidak lagi mencari pustaka 32 bit di / usr / lib32 . Saya ingin tahu apakah saya harus meletakkan bendera-bendera itu dalam urutan yang tetap?

Terima kasih atas ide dan bantuannya!

EDIT: ketika saya menambahkan flag -m32 di perintah gcc terakhir saya (tahap menghubungkan saya percaya), bahkan jika saya memiliki flag -L / usr / lib32 di tempat, gcc tidak mencari di / usr / lib32 lagi (sungguh aneh ...) dan menghasilkan kesalahan berikut:

/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

Adakah yang tahu mengapa ini terjadi? Saya menggunakan alat otomatis untuk mengkonfigurasi dan membuat. Saya sangat pandai memodifikasi file skrip tersebut.

EIDT : Saya memecahkan masalah. Saya pikir gcc mengharapkan arsip perpustakaan statis. Saya menggunakan skrip getlibs dari http://ubuntuforums.org/showthread.php?t=474790 untuk mengunduh semua arsip .a yang diperlukan untuk menautkan. Lalu gcc bekerja. Saya pikir gcc memang mencari di direktori / usr / lib32 tetapi tidak menemukan arsip .a kemudian mencari di direktori standar yaitu / usr / lib , di mana ia menemukan file * .so yang tidak kompatibel .

Tetapi kemudian pertanyaannya adalah: file * .so di / usr / lib32 / dari paket ia32-libs tidak benar-benar memiliki perpustakaan yang diperlukan untuk menghubungkan? Untuk apa file-file di / usr / lib32 / digunakan?

Kaya
sumber
stackoverflow.com/questions/22355436/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

15

LDFLAGSharus memasukkan -m32juga. Berikut ini harus bekerja:

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

Bahkan, Anda dapat menghapus -L/usr/lib32bagian, karena ini adalah direktori default untuk lib 32bit, dan sistem Anda mengetahui hal itu.

Pada dasarnya, cara paling sederhana untuk membangun aplikasi 32bit pada mesin 64bit adalah:

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

..atau memberi makan variabel-variabel tersebut untuk mengonfigurasi skrip jika Anda menggunakan autotools.

MEMPERBARUI:

Sepertinya Anda tidak terlalu mengenal perbedaan dalam menghubungkan dengan perpustakaan statis dan dinamis. Saya akan berusaha seminimal mungkin:

  • Pustaka pengembangan statis dan dinamis memiliki ekstensi file yang sama .a
  • Jika Anda telah menginstal versi statis dan dinamis dari pustaka yang sama, salah satunya mungkin memiliki postfix tambahan, seperti libname.auntuk libname_s.aversi dinamis dan untuk statis.
  • Tentu, versi perpustakaan statis dan dinamis berbeda ukurannya. Versi statis lebih berat.
  • Jika Anda menautkan dengan perpustakaan statis - aplikasi Anda tidak memiliki dependensi. Jika Anda menautkan dengan pustaka dinamis, itu akan bergantung pada .sopustaka runtime yang seharusnya ada di sistem Anda.

Harap dicatat, kami tidak berbicara tentang trik lanjutan di sini, seperti memuat secara eksplisit DSO menggunakan API dlopen () / dlsym ().

Andrejs Cainikovs
sumber
Sekarang saya pikir ada sesuatu yang salah dengan pengaturan saya. Setiap kali saya menambahkan -m32 dalam perintah gcc terakhir saya, ia mencari folder / usr / lib. Jika saya tidak menambahkan -m32, dan menggunakan flag -L / usr / lib32, ia mencari direktori yang benar tetapi menghasilkan kesalahan di atas. Apakah Anda tahu apa yang menyebabkan ini?
Rich
Dan apa yang akan terjadi jika Anda menggabungkan keduanya (seperti dalam contoh saya di atas)?
Andrejs Cainikovs
jika saya menggabungkan keduanya, masih tidak mencari di / usr / lib32. itu hanya mencari di / usr / lib. Dan btw, saya menggunakan alat otomatis.
Rich
Aneh .. Apakah Anda mencoba makan -l/usr/lib32/libXaw.sosaja?
Andrejs Cainikovs
Itu tidak dapat menemukan mereka ....: 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 / 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: tidak dapat menemukan -l / usr / lib32 / libXaw.so
Rich
9

Saya mendapatkan kesalahan seperti:

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

Ini memperbaikinya untuk saya:

sudo apt-get install g++-multilib

jika Anda menggunakan paket gcc selain yang default (mis. gcc-7), maka Anda harus menginstal paket untuk versi spesifik itu:

sudo apt-get install g++-7-multilib
Vladimir Panteleev
sumber
1
g++-multilibadalah untuk g ++ (C ++), untuk gcc (C) Anda juga perlu gcc-multilib.
pevik