2011-01-10 26 views
123

Tôi đang chạy phiên bản 32 bit của Ubuntu 10.10 và cố gắng biên dịch chéo sang mục tiêu 64 bit. Dựa trên nghiên cứu của tôi, tôi đã cài đặt gói g ++ - multilib.Thiếu bao gồm "bit/C++ config.h" khi biên dịch chéo chương trình 64 bit trên 32 bit trong Ubuntu

Chương trình này là một hello world rất đơn giản:

#include <iostream> 

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

Compile:

g++ -m64 main.cpp 

Lỗi:

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. 

Tôi đã tìm thấy một tập tin c++config.h nhưng người đó cư trú dưới i486-linux-gnui686-linux-gnu thư mục trong /usr/include/c++/4.4/ Không có c++config.h trong /usr/include/c++/bits.

Bất kỳ ý tưởng nào về những gì tôi bị thiếu? Biên dịch không có cờ -m64 hoạt động tốt (a.out được tạo và chạy chính xác).

Chỉnh sửa Nhờ gợi ý từ @nightcracker, tôi đã nghiên cứu thêm một chút về cấu trúc bao gồm trên hệ thống 32 và 64 bit. Tôi đã thêm một số answer bên dưới để "khắc phục" sự cố tạm thời nhưng tôi nghĩ rằng nó sẽ phá vỡ bản cập nhật tiếp theo. Về cơ bản, tôi thiếu một thư mục có tên là /usr/include/c++/4.4/i686-linux-gnu/64 nên chứa thư mục con có tên là bits có tệp bao gồm bị thiếu. Bất kỳ ý tưởng những gì gói nên được chăm sóc này?

+0

Wow ... Tôi cũng gặp sự cố này. GCC 4.8 trên ARMv7-a CubieTruck (Cortex-A7) chạy Ubuntu. Điều kỳ quái (với tôi) là, câu trả lời của Anthony đã sửa nó. Dù ... – jww

Trả lời

211

Thêm câu trả lời này một phần vì câu trả lời đã khắc phục được sự cố của tôi về cùng một vấn đề và do đó tôi có thể tự đánh dấu câu hỏi này.

tôi đã có thể sửa chữa nó bằng cách làm như sau:

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

Nếu bạn đã cài đặt một phiên bản của gcc/g++ không giao hàng theo mặc định (ví dụ như g++-4.8 trên sáng suốt) bạn sẽ cũng muốn khớp với phiên bản:

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

Làm việc cho tôi, cảm ơn. –

+0

Điều này cũng phù hợp với tôi. Cảm ơn bạn @Anthony – shahensha

+30

Đảm bảo khớp các phiên bản 'gcc và g ++' được cài đặt trên hệ thống của bạn. Trên Ubuntu 14.04, tôi đã cài đặt 'gcc-4.8' và' g ++ - 4.8', vì vậy tôi đã cài đặt 'gcc-4.8-multilib' và 'g ++ - 4.8-multilib'. –

10

Bạn đã thử thêm -I/usr/include/c++/4.4/i486-linux-gnu hoặc -I/usr/include/c++/4.4/i686-linux-gnu?

+0

Điều đó thực sự hiệu quả. Bất kỳ ý tưởng về lý do tại sao tôi sẽ cần phải làm điều này chỉ với 64 bit? Tôi đang cố gắng để thiết lập máy này lên để giúp đỡ với phân phối 64 bit xây dựng và muốn tránh quá nhiều tùy biến. –

+2

Tôi xin lỗi, tôi không có ý tưởng, tôi chỉ đặt ra một giải pháp làm việc nhanh chóng hacky :) – orlp

1

Trên hệ thống 64 bit của tôi, tôi nhận thấy rằng các thư mục sau tồn tại:

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

Nó sau đó sẽ có ý nghĩa rằng trên hệ thống 32-bit của tôi đã được thiết lập cho 64bit chéo biên soạn nên có một thư mục tương ứng như :

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

Tôi đã kiểm tra kỹ và thư mục này không tồn tại. Chạy g++ với tham số tiết cho thấy trình biên dịch đã thực sự tìm kiếm cái gì ở vị trí này:

[email protected]:~/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. 

Các lỗi liên quan đến việc ignoring nonexistent directory là đầu mối. Thật không may, tôi vẫn không biết những gì gói tôi cần phải cài đặt để có thư mục này hiển thị vì vậy tôi chỉ cần sao chép các thư mục /usr/include/c++/4.4/x86_64-linux-gnu/bits từ máy 64 bit của tôi để /usr/include/c++/4.4/i686-linux-gnu/64/bits trên máy 32 của tôi.

Hiện biên dịch chỉ với -m64 hoạt động chính xác. Hạn chế lớn nhất là đây vẫn chưa phải là cách chính xác để làm mọi thứ và tôi đoán lần sau khi cài đặt Update Manager và cập nhật lên g ++ mọi thứ có thể bị hỏng.

3

Có vẻ là một lỗi typo trong đó gói gcc.Giải pháp:

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

Trong khi biên soạn trong RHEL 6.2 (x86_64), tôi cài đặt cả 32bit và 64bit libstdC++ - gói dev, nhưng tôi đã có "C++ config.h không có tập tin hoặc thư mục" Vấn đề .

Độ phân giải:

Thư mục /usr/include/c++/4.4.6/x86_64-redhat-linux bị thiếu.

tôi đã làm như sau:

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

Tôi bây giờ có thể biên dịch mã nhị phân 32bit trên một hệ điều hành 64bit.

+1

Trên OpenSUSE tôi đã làm 'cd /usr/include/c++/4.6;ln -s x86_64-suse-linux i586-suse-linux' – Julian