Thiếu bao gồm các bit bit / c ++ config.h, khi biên dịch chéo chương trình 64 bit trên 32 bit trong Ubuntu


181

Tôi đang chạy phiên bản 32 bit của Ubuntu 10.10 và đang cố gắng biên dịch chéo thành 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.

Chương trình này là một thế giới xin chào rất đơn giản:

#include <iostream>

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

Biên dịch:

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 c++config.htập tin nhưng chúng nằm trong i486-linux-gnuvà các i686-linux-gnuthư mục trong /usr/include/c++/4.4/Không có c++config.htrong /usr/include/c++/bits.

Bất cứ ý tưởng về những gì tôi đang thiếu? Biên dịch mà không có -m64cờ 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 các hệ thống 32 và 64 bit. Tôi đã thêm một câu trả lời bên dưới rằng "khắc phục" vấn đề tạm thời nhưng tôi nghĩ nó sẽ bị hỏng trong bản cập nhật tiếp theo. Về cơ bản, tôi đang thiếu một thư /usr/include/c++/4.4/i686-linux-gnu/64mục được gọi là thư mục con bitscó chứa tệp bao gồm thiếu. Bất kỳ ý tưởng những gói nên được chăm sóc này?


1
Wow ... tôi cũng có vấn đề này GCC 4.8 trên ARMv7-a CubieTruck (Cortex-A7) chạy Ubuntu. Điều kỳ lạ (với tôi) là, câu trả lời của Anthony đã sửa nó.
Sao cũng được

Câu trả lời:


308

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

Tôi đã có thể sử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 gcc/ g++không được gửi theo mặc định (chẳng hạn như g++-4.8trên lucid), bạn cũng sẽ muốn khớp với phiên bản đó:

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

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

3
Điều này đã giải quyết vấn đề của tôi khi biên dịch với -m32 trên máy 64 bit. Cảm ơn
nic

41
Cảm ơn con trỏ, nhưng sudo apt-get install gcc-multilib g++-multilibcó vẻ tốt hơn (nó tự động chuyển sang phiên bản gcc của bạn).
leesei

^ có lẽ không! @ Đề nghị của Zoltan làm việc cho tôi mặc dù. Anthony Sottile, có lẽ bạn nên kết hợp nhận xét của Zoltan trong câu trả lời của bạn?
Người đàn ông

@Man cảm thấy thoải mái khi đề xuất một chỉnh sửa, khi tôi đăng nó lần đầu tiên, tôi đã khớp với phiên bản được hỏi trong câu hỏi, nó đã thay đổi từ các chỉnh sửa khác
Anthony Sottile

11

Bạn đã thử thêm -I/usr/include/c++/4.4/i486-linux-gnuhay -I/usr/include/c++/4.4/i686-linux-gnuchưa?


Điều đó thực sự làm việc. Bất cứ ý tưởng về lý do tại sao tôi chỉ cần 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 để trợ giúp với các bản dựng 64 bit phân tán và muốn tránh quá nhiều tùy chỉnh.
Jesse Vogt

2
Tôi xin lỗi, tôi không biết, tôi chỉ đưa ra một giải pháp làm việc nhanh chóng hack :)
orlp

5

Trong khi biên dịch trong RHEL 6.2 (x86_64), tôi đã cài đặt cả gói libstdc ++ - dev 32 bit và 64 bit, nhưng tôi gặp vấn đề "c ++ config.h không có tệp hoặc thư mục như vậy ".

Nghị quyết:

Thư mục /usr/include/c++/4.4.6/x86_64-redhat-linuxbị 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

Bây giờ tôi có thể biên dịch các nhị phân 32 bit trên HĐH 64 bit.


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

3

Có vẻ là một lỗi đánh máy 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

2

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

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

Sau đó, điều đó có nghĩa là trên hệ thống 32 bit của tôi đã được thiết lập để biên dịch chéo 64 bit 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 lại và thư mục này không tồn tại. Chạy g++với tham số verbose cho thấy trình biên dịch thực sự đang tìm kiếm thứ gì đó ở vị trí này:

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.

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

Bây giờ biên dịch với chỉ các -m64công việc chính xác. Hạn chế lớn là đây vẫn chưa phải là cách chính xác để thực hiện và tôi đoán lần sau khi Trình quản lý cập nhật cài đặt và cập nhật lên g ++, mọi thứ có thể bị hỏng.



1

Về cơ bản, nó được sử dụng trong HeapOverflows hoặc các loại đảo ngược khác Các vấn đề tức là Nếu bạn muốn thay đổi ELF 64 bit thành ELF 32 bit và nó đang hiển thị lỗi trong khi chuyển đổi.

Bạn chỉ có thể chạy các lệnh

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

sẽ cập nhật các gói thư viện của bạn được nâng cấp:

Các gói bổ sung sau đây sẽ được cài đặt: g ++ - 8-multilib gcc-8-multilib lib32asan5 lib32atomic1 lib32gcc-8-dev lib32gomp1 lib32itm1 lib32mpx2 lib32quadmath0 lib32std-lib -xa libc6-dev-x32 libc6-i-xít-xê-xê-xê-xê-xê-mi-mi-mi-rơ-mi Glibc-doc 8-dbg Các gói MỚI sau đây sẽ được cài đặt:g ++ - 8-multilib g ++ - multilib gcc-8-multilib g ++-multilib gcc-8-multilib gcc-multilib gcc-multilib gcc-multilib lib32atomic1, một lúc, một lúc, một lúc đó, một lúc đó 8-dev libx32gcc1 libx32gomp1 libx32itm1 libx32quadmath0 libx32stdc ++ - 8-dev libx32stdc ++ 6 libx32ubsan1

tương tự như điều này sẽ được hiển thị cho thiết bị đầu cuối của bạn


0

Từ kinh nghiệm của tôi, sudo apt-get install gcc-multilib g++-multilibgiúp đỡ. Nhưng một vấn đề khác của tôi là tôi QUÊN làm sạch thư mục để tôi vẫn gặp lỗi tương tự. Đây là lần đầu tiên sử dụng tiếng kêu hoặc cmake. Vì vậy, tôi chỉ cần xóa thư mục gốc của tôi và biên dịch lại và nó hoạt động. Hy vọng nó sẽ giúp một người như tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.