2012-08-09 145 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-gccmake install-gcc

    使用了以下配置:

    $ ../gcc/configure --enable-languages = c,C++,objc,obj-C++ --with-gmp =/opt/local --with-mpfr =/opt/local - 與-MPC = /選擇/本地前綴=在/ usr /本地/交叉/ Linux的--target = x86_64的-PC-Linux的GNU --disable-NLS

  4. 點構建環境在十字架使用config

    0 -compiler

    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.

    ../glibc/configure --host = x86_64-pc-linux-gnu --build = x86_64-apple-darwin11 --prefix =/usr/local/cross/linux/--with-binutils =/usr /本地/交叉/ LINUX /斌/ --with報頭=的/ usr /本地/交叉/ LINUX /包含/ libc_cv_forced_unwind = YES 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你能澄清嗎?爲什麼任何交叉編譯器需要主機操作系統的任何東西?關於整個工具鏈,原則上有點腥意。這是一個分期問題嗎?就像試圖在本地平臺上使用Linux庫從第2階段到第3階段一樣? – Potatoswatter 2012-08-09 02:51:58

+0

對不起,我看錯了。 – 2012-08-09 02:54:17

+0

似乎它會爲你節省幾天的時間來安裝虛擬機。交叉編譯是一個真正的熊。 – 2012-08-09 02:55:03

回答

1

爲了正確地構建glibc,需要Linux系統中的頭文件 - 可能內核頭文件已足夠。

這是由於這樣一個事實,那就是在那個系統的軟件的任何正常版本中都需要這些頭文件,交叉編譯時也是一樣。

自從我創建交叉編譯器已經很長時間了,所以我不能告訴你如何讓glibc的構建看到標題,但我相信它可以以直接的方式完成。

+0

謝謝,我很快會重新訪問以驗證此答案。 – Potatoswatter 2013-09-14 08:33:47

+0

你解決了嗎? – ash 2013-09-27 04:43:21

+0

對不起,沒有得到解決。目前我沒有使用Linux做任何事情。我希望在未來幾個月內。 – Potatoswatter 2013-09-27 06:30:38