สิ่งที่ขาดหายไปคือ“ bits / c ++ config.h” เมื่อข้ามการรวบรวมโปรแกรม 64 บิตใน 32 บิตใน Ubuntu


181

ฉันกำลังใช้งาน Ubuntu 32 บิตรุ่น 10.10 และพยายามคอมไพล์ข้ามไปยังเป้าหมาย 64 บิต จากการวิจัยของฉันฉันได้ติดตั้งแพ็คเกจ g ++ - multilib

โปรแกรมนี้เป็นโปรแกรมสวัสดีทั่วโลก:

#include <iostream>

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

รวบรวม:

g++ -m64 main.cpp

ข้อผิดพลาด:

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.

ฉันได้พบc++config.hไฟล์ แต่พวกเขาอาศัยอยู่ภายใต้i486-linux-gnuและi686-linux-gnuไดเรกทอรีใน/usr/include/c++/4.4/ไม่มีในc++config.h/usr/include/c++/bits

ความคิดใด ๆ เกี่ยวกับสิ่งที่ฉันหายไป? การคอมไพล์โดยไม่มี-m64ค่าสถานะทำงานได้ดี (a.out ถูกสร้างและทำงานอย่างถูกต้อง)

แก้ไขด้วยคำใบ้จาก @nightcracker ฉันได้ทำการตรวจสอบเพิ่มเติมอีกเล็กน้อยเกี่ยวกับโครงสร้างการรวมในระบบ 32 และ 64 บิต ฉันได้เพิ่มคำตอบด้านล่างว่า "แก้ไข" ปัญหาชั่วคราว แต่ฉันคิดว่ามันจะหยุดการอัปเดตครั้งต่อไป โดยทั่วไปฉันไม่มีไดเรกทอรีที่เรียก/usr/include/c++/4.4/i686-linux-gnu/64ว่าควรมีไดเรกทอรีย่อยที่เรียกbitsว่ามีไฟล์ include ขาดหายไป ความคิดใดที่ควรดูแลแพคเกจนี้


1
ว้าว ... ฉันมีปัญหานี้ด้วย GCC 4.8 บน ARMv7-a CubieTruck (Cortex-A7) ที่ใช้งาน Ubuntu สิ่งที่แปลกประหลาด (สำหรับฉัน) คือคำตอบของแอนโทนี่ซ่อมได้ อะไรก็ตาม ...
jww

คำตอบ:


308

การเพิ่มคำตอบบางส่วนเนื่องจากแก้ไขปัญหาของฉันของปัญหาเดียวกันและเพื่อให้ฉันสามารถคั่นคำถามนี้ด้วยตนเอง

ฉันสามารถแก้ไขได้โดยทำสิ่งต่อไปนี้:

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

หากคุณติดตั้งรุ่นgcc/ g++ที่ไม่ได้จัดส่งตามค่าเริ่มต้น (เช่นg++-4.8lucid) คุณจะต้องจับคู่เวอร์ชันด้วย:

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

30
ตรวจสอบให้แน่ใจว่าตรงกับรุ่นของการgcc and g++ติดตั้งในระบบของคุณ ใน Ubuntu 14.04 ฉันมีgcc-4.8และg++-4.8ติดตั้งแล้วดังนั้นฉันจึงติดตั้งgcc-4.8-multilib และg++-4.8-multilibแทน
Zoltan

3
สิ่งนี้แก้ไขปัญหาของฉันเมื่อรวบรวมกับ -m32 บนเครื่อง 64 บิต ขอบคุณ
nic

41
ขอบคุณสำหรับตัวชี้ แต่sudo apt-get install gcc-multilib g++-multilibดูเหมือนจะดีกว่า (มันจะแก้ไขรุ่น gcc ของคุณโดยอัตโนมัติ)
leesei

อาจจะไม่! @ ข้อเสนอแนะ Zoltan ของทำงานให้ฉันแม้ว่า Anthony Sottile บางทีคุณควรรวมข้อคิดเห็นของ Zoltan ไว้ในคำตอบของคุณ?
ชาย

@Man อย่าลังเลที่จะแนะนำการแก้ไขเมื่อฉันโพสต์ครั้งแรกฉันตรงกับรุ่นที่ถามในคำถามตั้งแต่มีการเปลี่ยนแปลงจากการแก้ไขอื่น ๆ
Anthony Sottile

11

คุณลองเพิ่ม-I/usr/include/c++/4.4/i486-linux-gnuหรือ-I/usr/include/c++/4.4/i686-linux-gnuไม่?


มันใช้งานได้จริง ความคิดเกี่ยวกับสาเหตุที่ฉันจะต้องทำเช่นนี้เพียง 64 บิต? ฉันพยายามตั้งค่าเครื่องนี้เพื่อช่วยในการสร้าง 64 บิตแบบกระจายและต้องการหลีกเลี่ยงการกำหนดเองมากเกินไป
Jesse Vogt

2
ฉันขอโทษฉันไม่มีความคิดฉันเพิ่งโพสต์วิธีแก้ปัญหาการทำงานอย่างรวดเร็ว
แฮ็

5

ขณะคอมไพล์ใน RHEL 6.2 (x86_64) ฉันติดตั้งแพคเกจทั้ง 32 บิตและ 64 บิต libstdc ++ - dev แต่ฉันมี"c ++ config.h ไม่มีปัญหาไฟล์หรือไดเรกทอรี "

ความละเอียด:

ไดเรกทอรี/usr/include/c++/4.4.6/x86_64-redhat-linuxขาดหายไป

ฉันทำต่อไปนี้:

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

ตอนนี้ฉันสามารถรวบรวมไบนารี 32 บิตบนระบบปฏิบัติการ 64 บิตได้แล้ว


1
ใน OpenSUSE ฉันทำได้cd /usr/include/c++/4.6;ln -s x86_64-suse-linux i586-suse-linux
Julian

3

ดูเหมือนว่าจะเป็นข้อผิดพลาดที่พิมพ์ผิดในแพ็คเกจของ gcc นั้น การแก้ไขปัญหา:

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

2

ในระบบ 64 บิตของฉันฉันสังเกตเห็นว่ามีไดเรกทอรีดังต่อไปนี้:

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

จากนั้นจะสมเหตุสมผลว่าในระบบ 32 บิตของฉันที่ได้รับการตั้งค่าสำหรับการรวบรวมข้าม 64 บิตควรมีไดเรกทอรีที่สอดคล้องกันเช่น:

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

ฉันตรวจสอบซ้ำแล้วซ้ำอีกและไม่มีไดเรกทอรีนี้อยู่ การรันg++ด้วยพารามิเตอร์ verbose แสดงว่าคอมไพเลอร์กำลังมองหาบางสิ่งบางอย่างในตำแหน่งนี้:

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.

ข้อผิดพลาดเกี่ยวกับการignoring nonexistent directoryเป็นเบาะแส น่าเสียดายที่ฉันยังไม่ทราบว่าต้องติดตั้งแพคเกจใดเพื่อให้ไดเรกทอรีนี้ปรากฏขึ้นดังนั้นฉันเพิ่งคัดลอก/usr/include/c++/4.4/x86_64-linux-gnu/bitsไดเรกทอรีจากเครื่อง 64 บิตไปยัง/usr/include/c++/4.4/i686-linux-gnu/64/bitsเครื่อง 32 ของฉัน

ตอนนี้รวบรวมเพียง-m64ทำงานอย่างถูกต้อง ข้อเสียเปรียบที่สำคัญคือนี่ยังไม่ใช่วิธีที่ถูกต้องในการทำสิ่งต่าง ๆ และฉันคาดเดาว่าครั้งต่อไปที่ตัวจัดการการปรับปรุงจะติดตั้งและอัปเดตเป็นสิ่ง g ++



1

โดยทั่วไปจะใช้ใน HeapOverflows หรือประเภทการย้อนกลับอื่น ๆ ปัญหาเช่นหากคุณต้องการเปลี่ยน 64 บิต ELF เป็น 32 บิต ELF และแสดงข้อผิดพลาดขณะแปลง

คุณสามารถเรียกใช้คำสั่ง

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

ซึ่งจะอัปเดตแพคเกจห้องสมุดที่อัปเกรดแล้ว:

แพ็กเกจเพิ่มเติมต่อไปนี้จะถูกติดตั้ง: g ++ - 8-multilib gcc-8-multilib lib32asan5 lib32atomic1 lib32gcc-8-dev lib32gomp1 lib32itm1 lib32mpad2 lib32quadmath0 lib32stdc ++ - 8-dev lib32ubsan1 libc-dev-libc-dev6 -c -i386 libc6-dev-x32 libc6-i386 libc6-x32 libx32asan5 libx32atomic1 libx32gcc-8-dev libx32gcc1 libx32gm1 libx32stadmath0 libx32stadmath0 8-dbg glibc-doc แพ็คเกจใหม่ต่อไปนี้จะถูกติดตั้ง:g ++ - 8-multilib g ++ - multilib gcc-8-multilib gcc-multilib lib32asan5 lib32-32cxc32 -8 lib32gcc-8-dev lib32gc1 lib32gmd2 lib32quadmath0 lib32stdc -8 8-dev libx32gcc1 libx32gomp1 libx32itm1 libx32quadmath0 libx32stdc ++ - 8-dev libx32stdc ++ 6 libx32ubsan1

คล้ายกับสิ่งนี้จะปรากฏในสถานีของคุณ


0

จากประสบการณ์ของฉันsudo apt-get install gcc-multilib g++-multilibช่วย แต่ปัญหาอื่นของฉันคือฉันลืมทำความสะอาดไดเรกทอรีดังนั้นฉันยังคงได้รับข้อผิดพลาดเดียวกัน มันเป็นครั้งแรกที่ใช้ clang หรือ cmake ดังนั้นฉันเพียงแค่ลบไดเรกทอรีดั้งเดิมของฉันและรวบรวมใหม่และใช้งานได้ หวังว่าจะช่วยคนอย่างฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.