Ubuntu에서 32 비트에서 64 비트 프로그램을 크로스 컴파일 할 때 "bits / c ++ config.h"가 누락되었습니다.


181

32 비트 버전의 Ubuntu 10.10을 실행 중이며 64 비트 대상으로 크로스 컴파일하려고합니다. 내 연구에 따라 g ++-multilib 패키지를 설치했습니다.

이 프로그램은 매우 간단한 hello world입니다.

#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 비트 시스템의 include 구조에 대해 조금 더 조사했습니다. 아래에 문제를 일시적으로 "수정" 하는 답변 을 추가 했지만 다음 업데이트에서 문제가 발생한다고 생각합니다. 기본적으로 포함 파일이없는 /usr/include/c++/4.4/i686-linux-gnu/64하위 디렉토리를 포함 해야하는 디렉토리 bits가 누락되었습니다. 어떤 패키지가 이것을 처리해야하는지 아십니까?


1
와우 ... 나도이 문제가 있었다. Ubuntu를 실행하는 ARMv7-CubieTruck (Cortex-A7)의 GCC 4.8 (나에게) 기괴한 것은 Anthony의 대답이 그것을 고쳤다는 것이다. 도대체 무엇이...
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++시스템 에 설치된 버전과 일치 해야합니다. 우분투 14.04에 나는했다 gcc-4.8g++-4.8I가 설치되어 있으므로, 설치 gcc-4.8-multilib g++-4.8-multilib대신.
졸탄

3
이것은 64 비트 컴퓨터에서 -m32로 컴파일 할 때 내 문제를 해결했습니다. 감사합니다
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

이제 64 비트 OS에서 32 비트 바이너리를 컴파일 할 수 있습니다.


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

그런 다음 64 비트 크로스 컴파일을 위해 설정된 32 비트 시스템에는 다음과 같은 해당 디렉토리가 있어야합니다.

/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/bits32 머신으로 디렉토리를 .

이제 -m64제대로 작동 하는 컴파일 . 가장 큰 단점은 이것이 올바른 방법이 아니라는 점이며, 다음에 Update Manager를 설치하고 g ++로 업데이트하면 문제가 발생할 수 있습니다.



1

기본적으로 HeapOverflow 또는 기타 역전 유형 문제에 사용됩니다. 즉, 64 비트 ELF를 32 비트 ELF로 변경하고 변환하는 동안 오류가 표시됩니다.

당신은 단순히 명령을 실행할 수 있습니다

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

그러면 라이브러리가 업데이트됩니다.

다음과 같은 추가 패키지가 설치됩니다. g ++-8-multilib gcc-8-multilib lib32asan5 lib32atomic1 lib32gcc-8-dev lib32gomp1 lib32itm1 lib32mpx2 lib32quadmath0 lib32stdc ++-8-dev lib32ubsan1 libc-dev-bin libc6 libc6-dbg libc6-dev libc6-dev -i386 libc6-dev-x32 libc6-i386 libc6-x32 libx32asan5 libx32atomic1 libx32gcc-8-dev libx32gcc1 libx32gomp1 libx32itm1 libx32quadmath0 libx32stdc ++-8-dev libx32stdc ++ 6 libx32ubsan1 권장 패키지 -8 : lib32stdc ++ 8-dbg glibc-doc 다음 새 패키지가 설치됩니다.g ++-8-multilib g ++-multilib gcc-8-multilib gcc-multilib lib32asan5 lib32atomic1 lib32gcc-8-dev lib32gomp1 lib32itm1 lib32mpx2 lib32quadmath0 lib32stdc ++-8-dev lib32ubsan1 libc6-dev-i386 libc6-dev-x32 libc6-x32 libx32a 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.