2012-08-09 4 views
6

OS X 10.7 + Eclipse 빌드 시스템에서 Linux 서버용 바이너리를 컴파일하려고합니다. 이것은 GCC 크로스 컴파일러를 의미합니다. 나는 네이티브 4.7.1에서 시작하여 호스트 4.7.1에서 촬영하고있다.OS X에서 Linux로 크로스 컴파일

대부분의 온라인 지침은 임베디드 개발에만 적용됩니다. 나는 libstdC++ - v3과 glibc를 사용하고 싶다.

어떻게 성공 :

  1. 패키지

    port install gcc47 
    export CC=gcc-mp-47 
    export LD=ld-mp-47 
    export CXX=g++-mp-47 
    export CPP=cpp-mp-47 
    
    port install gmake 
    ln /opt/local/bin/gmake /opt/local/bin/make 
    
    port install gsed 
    ln /opt/local/bin/gsed /opt/local/bin/sed 
    
    port install gawk 
    port install autoconf 
    port install msgfmt 
    
  2. 만들기를 설치하고 설치의 binutils-2.22

  3. make all-gcc 다음과 같은 설정을 사용 make install-gcc

    :

    $ ../gcc/configure --enable-languages ​​= c, C++, objc, obj-C++ --with-gmp =/opt/local --with-mpfr =/opt/local - 와-MPC 십자가에서 =/옵션/지역 --prefix =/usr/지방/간/리눅스 --target = x86_64에-PC-리눅스 GNU --disable-NLS

  4. 포인트 빌드 환경 는 config

    0을 사용

    export CC=/usr/local/cross/linux/bin/x86_64-pc-linux-gnu-gcc 
    export LD=/usr/local/cross/linux/bin/x86_64-pc-linux-gnu-ld 
    export AR=/usr/local/cross/linux/bin/x86_64-pc-linux-gnu-ar 
    export CXX=/usr/local/cross/linux/bin/x86_64-pc-linux-gnu-g++ 
    export CPP=/usr/local/cross/linux/bin/x86_64-pc-linux-gnu-cpp 
    
  5. 빌드의 glibc-2.16 -compiler

    ../glibc/configure --host = x86_64-pc-linux-gnu --build = x86_64-apple-darwin11 --prefix =/usr/local/cross/linux/--with-binutils =/usr/

    : 지역/크로스/리눅스/빈/--with-헤더 =/usr/지방/간/리눅스// libc_cv_forced_unwind = 예 libc_cv_ctors_header = 예 = libc_cv_c_cleanup 예

실패 포함 glibc 빌드가 오래 전에 실패합니다. 이 메시지는 여러 번 나타납니다 :

In file included from ./sysdeps/unix/sysdep.h:20:0, 
       from ./sysdeps/unix/x86_64/sysdep.h:18, 
       from sysdeps/unix/sysv/linux/x86_64/sysdep.h:22, 
       from <stdin>:1: 
sysdeps/unix/sysv/linux/sys/syscall.h:24:24: fatal error: asm/unistd.h: No such file or directory 
compilation terminated. 

이것은 정상적인 현상 일 수 있습니다.

그런 다음 stdio_lim.h을 생성하지 못합니다. make -d으로,이 얻을 :

  Successfully remade target file `/Users/dkrauss/Documents/work/glibc-build/csu/abi-tag.h'. 
      Considering target file `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.h'. 
      File `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.h' does not exist. 
      Looking for an implicit rule for `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.h'. 
      Trying pattern rule with stem `lim'. 
      Trying implicit prerequisite `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.st'. 
      Found an implicit rule for `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.h'. 
      Considering target file `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.st'. 
      Recently tried and failed to update file `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.st'. 
make[2]: *** No rule to make target `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.st', needed by `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.h'. Stop. 

이것은 bits 구축을 시도 최초의 헤더입니다. 파일에 stdio_lim.h.in이 있으며, 해당 디렉토리에 파일은 .in뿐입니다. 어떤 규칙에 .st.in에 연결해야합니까?

+0

@DietrichEpp 명확하게 할 수 있습니까? 어떤 교차 컴파일러가 호스트 OS에서 어떤 것을 요구해야합니까? 원칙적으로 전체 툴체인에 대해 뭔가 비린내가 있습니다. 스테이징 문제입니까? 네이티브 플랫폼에서 리눅스 라이브러리를 사용하여 2 단계에서 3 단계로 이동하는 것처럼? – Potatoswatter

+0

죄송합니다, 잘못 읽었습니다. –

+0

며칠 동안 VM을 설치하기 만하면됩니다. 크로스 컴파일은 진짜 곰입니다. –

답변

1

glibc를 올바르게 빌드하려면 Linux 시스템의 헤더 파일이 필요합니다. 아마도 커널 헤더로 충분할 것입니다.

이러한 헤더는 해당 시스템의 소프트웨어 빌드에서 필요하며 크로스 컴파일 할 때도 마찬가지입니다.

크로스 컴파일러를 만든 이후로 오랜 시간이 걸렸으므로 헤더를 보려면 glibc 빌드 방법을 알려줄 수는 없지만 간단하게 수행 할 수 있다고 생각합니다. .

+0

감사합니다.이 답변을 확인하기 위해 곧 다시 방문 할 것입니다. – Potatoswatter

+0

해결 되었습니까? – ash

+0

죄송합니다. 주위를 둘러 보지 않았습니다. 지금은 리눅스를 사용하고 있지 않습니다. 나는 앞으로 몇 개월 안에 잘하면 좋을 것입니다. – Potatoswatter