Hilang termasuk "bits / c ++ config.h" ketika cross compiling program 64 bit pada 32 bit di Ubuntu

181

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.hfile tetapi mereka berada di bawah i486-linux-gnudan i686-linux-gnudirektori di/usr/include/c++/4.4/ Tidak ada c++config.hdi /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/64yang seharusnya berisi subdirektori bernama bitsyang memiliki file include yang hilang. Tahu paket apa yang harus mengurus ini?

Jesse Vogt
sumber
1
Wow ... saya juga punya masalah ini. GCC 4.8 pada ARMv7-a CubieTruck (Cortex-A7) yang menjalankan Ubuntu. Yang aneh (bagi saya) adalah, jawaban Anthony memperbaikinya. Terserah ...
jww

Jawaban:

308

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:

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

Jika Anda menginstal versi gcc/ g++yang tidak dikirimkan secara default (seperti g++-4.8pada jernih) Anda juga ingin mencocokkan versi:

sudo apt-get install gcc-4.8-multilib g++-4.8-multilib
Anthony Sottile
sumber
30
Pastikan untuk mencocokkan versi yang gcc and g++diinstal pada sistem Anda. Di Ubuntu 14.04 saya telah gcc-4.8dan g++-4.8menginstal, jadi saya menginstal gcc-4.8-multilib dan g++-4.8-multilibsebagai gantinya.
Zoltán
3
Ini memecahkan masalah saya ketika mengkompilasi dengan -m32 pada mesin 64-bit. Terima kasih
nic
41
Terima kasih atas penunjuknya, tetapi sudo apt-get install gcc-multilib g++-multilibtampaknya lebih baik (ini memutuskan untuk versi gcc Anda secara otomatis).
leesei
^ mungkin tidak! Saran @ Zoltan bekerja untuk saya. Anthony Sottile, mungkin Anda harus memasukkan komentar Zoltan dalam jawaban Anda?
Man
@Man merasa bebas untuk menyarankan suntingan, ketika saya awalnya mempostingnya saya cocok dengan versi yang ditanyakan dalam pertanyaan, sejak itu telah berubah dari suntingan lain
Anthony Sottile
11

Apakah Anda mencoba menambahkan -I/usr/include/c++/4.4/i486-linux-gnuatau -I/usr/include/c++/4.4/i686-linux-gnu?

orlp
sumber
Itu memang berhasil. Tahu mengapa saya perlu melakukan ini hanya 64 bit? Saya mencoba mengatur mesin ini untuk membantu mendistribusikan build 64 bit dan ingin menghindari terlalu banyak penyesuaian.
Jesse Vogt
2
Maaf, saya tidak tahu, saya baru saja mengajukan solusi kerja cepat :)
orlp
5

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

Saya melakukan yang berikut:

cd /usr/include/c++/4.4.6/
mkdir x86_64-redhat-linux
cd x86_64-redhat-linux
ln -s ../i686-redhat-linux 32

Saya sekarang dapat mengkompilasi binari 32bit pada OS 64bit.

Pekmez
sumber
1
Pada OpenSUSE yang saya lakukancd /usr/include/c++/4.6;ln -s x86_64-suse-linux i586-suse-linux
Julian
3

Tampaknya ada kesalahan ketik dalam paket gcc itu. Solusinya:

mv /usr/include/c++/4.x/i486-linux-gnu /usr/include/c++/4.x/i686-linux-gnu/64
Dansa dansa
sumber
2

Pada sistem 64 bit saya, saya perhatikan bahwa direktori berikut ada:

/usr/include/c++/4.4/x86_64-linux-gnu/32/bits

Maka akan masuk akal bahwa pada sistem 32 bit saya yang telah diatur untuk kompilasi silang 64bit harus ada direktori yang sesuai seperti:

/usr/include/c++/4.4/i686-linux-gnu/64/bits

Saya mengecek ulang dan direktori ini tidak ada. Berjalan g++dengan parameter verbose menunjukkan bahwa kompiler benar-benar mencari sesuatu di lokasi ini:

jesse@shalored:~/projects/test$ g++ -v -m64 main.cpp 
Using built-in specs.
Target: i686-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.4.4-14ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=i686-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu
Thread model: posix
gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5) 
COLLECT_GCC_OPTIONS='-v' '-m64' '-shared-libgcc' '-mtune=generic'
 /usr/lib/gcc/i686-linux-gnu/4.4.5/cc1plus -quiet -v -imultilib 64 -D_GNU_SOURCE main.cpp -D_FORTIFY_SOURCE=2 -quiet -dumpbase main.cpp -m64 -mtune=generic -auxbase main -version -fstack-protector -o /tmp/ccMvIfFH.s
ignoring nonexistent directory "/usr/include/c++/4.4/i686-linux-gnu/64"
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../i686-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/include/c++/4.4
 /usr/include/c++/4.4/backward
 /usr/local/include
 /usr/lib/gcc/i686-linux-gnu/4.4.5/include
 /usr/lib/gcc/i686-linux-gnu/4.4.5/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.
GNU C++ (Ubuntu/Linaro 4.4.4-14ubuntu5) version 4.4.5 (i686-linux-gnu)
    compiled by GNU C version 4.4.5, GMP version 4.3.2, MPFR version 3.0.0-p3.
GGC heuristics: --param ggc-min-expand=98 --param ggc-min-heapsize=128197
Compiler executable checksum: 1fe36891f4a5f71e4a498e712867261c
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.

Kesalahan tentang ignoring nonexistent directoryitu 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/bitsdirektori dari mesin 64 bit /usr/include/c++/4.4/i686-linux-gnu/64/bitssaya ke mesin 32 saya.

Sekarang kompilasi hanya dengan -m64bekerja 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.

Jesse Vogt
sumber
1

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

apt-get install gcc-multilib g++-multilib

yang akan memperbarui Paket perpustakaan Anda yang ditingkatkan:

Paket tambahan berikut akan diinstal: g ++ - 8-multilib gcc-8-multilib lib32asan5 lib32atomic1 lib32gcc-8-dev lib32gomp1 lib32itm1 lib32mpx2 lib32quadmath0 lib32stdc ++ - 8-dev lib32 libc-libc libc-libc -i386 libc6-dev-x32 libc32-lddd ldc6 lbc6-x32 libx32asan5 libx32atomic1 libx32gcc-8-dev libx32gcc1 libx32gomp1 libx32itm1 libx32quadmath0 libx32quadmath0 libx32bdd lb lmx32 ldc ldc32 ldc32 ldc32 ldcd-lbc32-ldc32dc ldc3-l32 8-dbg glibc-doc Paket BARU berikut ini akan diinstal:g ++ - 8-multilib g ++ - multilib gcc-8-multilib gcc-multilib lib32asan5 lib32atomic1 lib32gcc-8-dev lib32gomp1 lib32itm1 lib32mpx2 lib32quadmath0 lib32stdc ++ - 8-dev lib32 lib32 lib32 lib32 lib32 lib32 lib32 lib32 lib32 lib32 lib32 8-dev libx32gcc1 libx32gomp1 libx32itm1 libx32quadmath0 libx32stdc ++ - 8-dev libx32stdc ++ 6 libx32ubsan1

mirip dengan ini akan ditampilkan ke terminal Anda

Luftatako
sumber
0

Dari pengalaman saya, sudo apt-get install gcc-multilib g++-multilibbantu. 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.

Koherensi
sumber