Saya menjalankan versi 32bit dari Ubuntu 10.10 dan mencoba melakukan cross compile ke target 64 bit. Berdasarkan penelitian saya, saya telah menginstal paket g ++ - multilib.
Program ini adalah hello world yang sangat sederhana:
#include <iostream>
int main( int argc, char** argv )
{
std::cout << "hello world" << std::endl;
return 0;
}
Menyusun:
g++ -m64 main.cpp
Kesalahan:
In file included from main.cpp:1:
/usr/include/c++/4.4/iostream:39: fatal error: bits/c++config.h: No such file or directory
compilation terminated.
Saya telah menemukan c++config.h
file tetapi mereka berada di bawah i486-linux-gnu
dan i686-linux-gnu
direktori di/usr/include/c++/4.4/
Tidak ada c++config.h
di /usr/include/c++/bits
.
Adakah ide tentang apa yang saya lewatkan? Kompilasi tanpa-m64
flag berfungsi dengan baik (a.out dibuat dan berjalan dengan benar).
Sunting Berkat petunjuk dari @nightcracker, saya melakukan sedikit investigasi lebih lanjut pada struktur include pada sistem 32 dan 64 bit. Saya telah menambahkan jawaban di bawah ini yang "memperbaiki" masalah sementara tetapi saya pikir itu akan rusak pada pembaruan berikutnya. Pada dasarnya, saya kehilangan sebuah direktori bernama /usr/include/c++/4.4/i686-linux-gnu/64
yang seharusnya berisi subdirektori bernama bits
yang memiliki file include yang hilang. Tahu paket apa yang harus mengurus ini?
sumber
Jawaban:
Menambahkan jawaban ini sebagian karena itu memperbaiki masalah saya dari masalah yang sama sehingga saya dapat menandai pertanyaan ini sendiri.
Saya dapat memperbaikinya dengan melakukan hal berikut:
Jika Anda menginstal versi
gcc
/g++
yang tidak dikirimkan secara default (sepertig++-4.8
pada jernih) Anda juga ingin mencocokkan versi:sumber
gcc and g++
diinstal pada sistem Anda. Di Ubuntu 14.04 saya telahgcc-4.8
dang++-4.8
menginstal, jadi saya menginstalgcc-4.8-multilib
dang++-4.8-multilib
sebagai gantinya.sudo apt-get install gcc-multilib g++-multilib
tampaknya lebih baik (ini memutuskan untuk versi gcc Anda secara otomatis).Apakah Anda mencoba menambahkan
-I/usr/include/c++/4.4/i486-linux-gnu
atau-I/usr/include/c++/4.4/i686-linux-gnu
?sumber
Ketika mengkompilasi di RHEL 6.2 (x86_64), saya menginstal paket libstdc ++ - 32bit dan 64bit, tetapi saya memiliki masalah "c ++ config.h no file or directory ".
Resolusi:
Direktori
/usr/include/c++/4.4.6/x86_64-redhat-linux
tidak ada.Saya melakukan yang berikut:
Saya sekarang dapat mengkompilasi binari 32bit pada OS 64bit.
sumber
cd /usr/include/c++/4.6;ln -s x86_64-suse-linux i586-suse-linux
Tampaknya ada kesalahan ketik dalam paket gcc itu. Solusinya:
sumber
Pada sistem 64 bit saya, saya perhatikan bahwa direktori berikut ada:
Maka akan masuk akal bahwa pada sistem 32 bit saya yang telah diatur untuk kompilasi silang 64bit harus ada direktori yang sesuai seperti:
Saya mengecek ulang dan direktori ini tidak ada. Berjalan
g++
dengan parameter verbose menunjukkan bahwa kompiler benar-benar mencari sesuatu di lokasi ini:Kesalahan tentang
ignoring nonexistent directory
itu adalah petunjuk. Sayangnya, saya masih tidak tahu paket apa yang perlu saya instal agar direktori ini muncul jadi saya hanya menyalin/usr/include/c++/4.4/x86_64-linux-gnu/bits
direktori dari mesin 64 bit/usr/include/c++/4.4/i686-linux-gnu/64/bits
saya ke mesin 32 saya.Sekarang kompilasi hanya dengan
-m64
bekerja dengan benar. Kelemahan utama adalah bahwa ini masih bukan cara yang benar untuk melakukan sesuatu dan saya menduga lain kali Update Manager menginstal dan memperbarui ke g ++ hal-hal yang mungkin rusak.sumber
Bug ini diperbaiki di "gcc-4.6".
https://bugs.launchpad.net/ubuntu/+source/gcc-4.5/+bug/793411
sumber
Pada dasarnya ini digunakan dalam HeapOverflows atau jenis pembalikan lainnya yaitu mis. Jika Anda ingin mengubah 64 bit ELF ke 32 bit ELF dan itu menunjukkan kesalahan saat mengkonversi.
Anda cukup menjalankan perintah
yang akan memperbarui Paket perpustakaan Anda yang ditingkatkan:
mirip dengan ini akan ditampilkan ke terminal Anda
sumber
Dari pengalaman saya,
sudo apt-get install gcc-multilib g++-multilib
bantu. Tapi masalah saya yang lain adalah bahwa saya LUPA membersihkan direktori jadi saya masih mendapatkan kesalahan yang sama. Ini adalah pertama kalinya menggunakan dentang atau cmake. Jadi saya hanya menghapus direktori asli saya dan kompilasi ulang dan berfungsi. Semoga ini bisa membantu orang seperti saya.sumber