Ubuntu'da 32 bit üzerinde 64 bit programı çapraz derlerken “bits / c ++ config.h” eksik


181

Ubuntu 10.10'un 32bit sürümünü çalıştırıyorum ve 64 bitlik bir hedefe derlemeye çalışıyorum. Araştırmamı temel alarak g ++ - multilib paketini yükledim.

Program çok basit bir merhaba dünya:

#include <iostream>

int main( int argc, char** argv )
{
  std::cout << "hello world" << std::endl;
  return 0;
}

Derleme:

g++ -m64 main.cpp

Hata:

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.

Ben bulduk c++config.hdosyayı ama altında bulundukları i486-linux-gnuve i686-linux-gnudizinleri de /usr/include/c++/4.4/yoktur c++config.hiçinde /usr/include/c++/bits.

Neyi kaçırdığım hakkında bir fikrin var mı? -m64Bayrak olmadan derleme iyi çalışır (a.out oluşturulur ve düzgün çalışır).

Düzenle @nightcracker'ın ipucu sayesinde, 32 ve 64 bit sistemlerde dahil etme yapısı hakkında biraz daha araştırma yaptım. Aşağıda, sorunu geçici olarak "gideren" bir yanıt ekledim, ancak bir sonraki güncellemede kırılacağını düşünüyorum. Temel olarak, eksik dahil dosyası olan /usr/include/c++/4.4/i686-linux-gnu/64bir alt dizin içermelidir adlı bir dizin bitseksik. Hangi paketin bununla ilgilenmesi gerektiği hakkında bir fikrin var mı?


1
Vay be ... Bende bu problem vardı. Ubuntu çalıştıran bir ARMv7-a CubieTruck (Cortex-A7) üzerinde GCC 4.8. (Bana göre) tuhaf olan şey, Anthony'nin cevabı bunu düzeltti. Her neyse ...
jww

Yanıtlar:


308

Bu sorunun cevabını kısmen eklemem, çünkü aynı sorundaki sorunumu düzeltti ve bu soruyu kendim işaretleyebilirim.

Aşağıdakileri yaparak düzeltmeyi başardım:

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

gcc/ g++Tarafından varsayılan olarak gönderilmeyen bir sürümünü yüklediyseniz ( g++-4.8lucid'de olduğu gibi ) sürümü de eşleştirmek istersiniz:

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

30
gcc and g++Sisteminizde kurulu sürümlerle eşleştiğinden emin olun . Ubuntu 14.04 üzerinde vardı gcc-4.8ve g++-4.8ben yüklü böylece, yüklü gcc-4.8-multilib ve g++-4.8-multilibonun yerine.
Zoltán

3
Bu, 64-bit bir makinede -m32 ile derlerken sorunumu çözdü. Teşekkürler
nic

41
İşaretçi için teşekkürler, ancak sudo apt-get install gcc-multilib g++-multilibdaha iyi görünüyor (otomatik olarak gcc sürümünüze gider).
leesei

^ belki değil! @ Zoltan'ın önerisi benim için çalıştı. Anthony Sottile, belki de Zoltan'ın yorumunu cevabınıza dahil etmelisiniz?
Erkek

@Bir düzenleme önermekten çekinmeyin, ilk olarak yayınladığımda soruda sorulan sürümle eşleştim, o zamandan beri başkalarının düzenlemelerinden değişti
Anthony Sottile

11

-I/usr/include/c++/4.4/i486-linux-gnuVeya eklemeyi denediniz -I/usr/include/c++/4.4/i686-linux-gnumi?


Gerçekten işe yarıyor. Bunu neden sadece 64 bit için yapmam gerektiğine dair bir fikrin var mı? Bu makineyi dağıtılmış 64 bit yapılara yardımcı olmak için ayarlamaya çalışıyorum ve çok fazla özelleştirmeden kaçınmak istiyorum.
Jesse Vogt

2
Üzgünüm, hiçbir fikrim yok, sadece hızlı bir hacky çalışma çözümü poz verdim :)
orlp

5

RHEL 6.2'de (x86_64) derlerken, hem 32bit hem de 64bit libstdc ++ - dev paketlerini kurdum, ancak "c ++ config.h böyle bir dosya veya dizin " sorunu yaşadım .

Çözüm:

Dizin /usr/include/c++/4.4.6/x86_64-redhat-linuxeksikti.

Aşağıdakileri yaptım:

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

Şimdi 64bit işletim sisteminde 32bit ikili dosyaları derleyebiliyorum.


1
OpenSUSE üzerinde yaptımcd /usr/include/c++/4.6;ln -s x86_64-suse-linux i586-suse-linux
Julian

3

Gcc paketinde bir yazım hatası gibi görünüyor. Çözüm:

mv /usr/include/c++/4.x/i486-linux-gnu /usr/include/c++/4.x/i686-linux-gnu/64

2

64 bit sistemimde aşağıdaki dizinin var olduğunu fark ettim:

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

Daha sonra 64 bit çapraz derleme için ayarlanmış olan 32 bit sistemimde aşağıdaki gibi karşılık gelen bir dizin olması mantıklı olacaktır:

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

Çift kontrol ettim ve bu dizin yoktu. Koşu g++derleyici aslında bu konumda bir şey arıyordu olduğunu gösterdi ayrıntılı parametreyle:

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.

İle ilgili hata ignoring nonexistent directoryipucu oldu. Ne yazık ki, hala bu dizinin görünmesi için hangi paketi yüklemem gerektiğini bilmiyorum, bu yüzden /usr/include/c++/4.4/x86_64-linux-gnu/bitsdizini sadece 64 bit /usr/include/c++/4.4/i686-linux-gnu/64/bitsmakinemden 32 makineme kopyaladım .

Şimdi sadece -m64doğru çalışma ile derleme . En büyük dezavantajı, bu hala bir şeyler yapmak için doğru yol değildir ve bir dahaki sefere Güncelleme Yöneticisi yüklediğinde ve g ++ şeyler için güncelleme kırılacağını tahmin ediyorum.



1

Temel olarak HeapOverflows veya diğer tersine çevirme türlerinde kullanılır. Yani 64 bit ELF'yi 32 bit ELF olarak değiştirmek istiyorsanız ve dönüştürme sırasında hata gösteriyor.

Sadece komutları çalıştırabilirsiniz

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

kütüphanelerinizi güncelleyecek paketler yükseltildi:

Aşağıdaki ek paketler kurulacaktır: g ++ - 8-multilib gcc-8-multilib lib32asan5 lib32atomic1 lib32gcc-8-dev lib32gomp1 lib32itm1 lib32mpx2 lib32quadmath0 lib32stdc ++ - 8-dev lib32ubp1 lib32itm1 lib32mpx2 lib32quadmath0 lib32stdc ++ - 8-dev lib32ubsan1 libc-dev-bin libc6 libc6-dbg6-dbg -i386 libc6-dev-x32 libc6-i386 libc6-x32 libx32asan5 libx32atomic1 libx32gcc-8-dev libx32gcc1 libx32gomp1 libx32itm1 libx32quadmath0 libx32gcc-8-dev libx32gcc1 libx32gomp1 libx32itm1 libx32quadmath0 libx32stdc ++ - 8-dev libx32stdc ++ 6 - dxdxdx1 8-dbg glibc-doc Aşağıdaki YENİ paketler kurulacak:g ++ - 8-multilib g ++ - multilib gcc-8-multilib gcc-multilib lib32asan5 lib32atomic1 lib32gcc-8-dev lib32gomp1 lib32itm1 lib32mpx2 lib32quadmath0 lib32stdc ++ - 8-dev lib32ubsan1 lib32itm1 lib32mpx2 lib32quadmath0 lib32stdc ++ - 8-dev lib32ubsan1 lib32itm1 libcmpa32x32x32x32x32x32 8-dev libx32gcc1 libx32gomp1 libx32itm1 libx32quadmath0 libx32stdc ++ - 8-dev libx32stdc ++ 6 libx32ubsan1

buna benzer terminalinize gösterilecek


0

Deneyimlerime göre, sudo apt-get install gcc-multilib g++-multilibyardımcı olur. Ama başka bir sorun, ben hala aynı hatayı almak bu yüzden dizini temizlemek UNUTMAK. Clang veya cmake ilk kez kullanılıyor. Bu yüzden sadece orijinal dizinimi silerim ve yeniden derlerim ve çalışır. Umarım benim gibi birine yardımcı olur.

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.