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?
Jawaban:
LDFLAGS
harus memasukkan-m32
juga. Berikut ini harus bekerja:Bahkan, Anda dapat menghapus
-L/usr/lib32
bagian, 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:
..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:
.a
libname.a
untuklibname_s.a
versi dinamis dan untuk statis..so
pustaka 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 ().
sumber
-l/usr/lib32/libXaw.so
saja?Saya mendapatkan kesalahan seperti:
Ini memperbaikinya untuk saya:
jika Anda menggunakan paket gcc selain yang default (mis.
gcc-7
), maka Anda harus menginstal paket untuk versi spesifik itu:sumber
g++-multilib
adalah untuk g ++ (C ++), untuk gcc (C) Anda juga perlugcc-multilib
.