关于在32位linux(debian)虚拟机上搭建iphone toolchain实战

来源:互联网 发布:b站翻唱软件 编辑:程序博客网 时间:2024/03/29 00:02

  直接上主题了。

  一般搭建toolchain的朋友,肯定就已经看过了google的那篇搭建文章,原地址http://code.google.com/p/iphone-dev/wiki/Building,有兴趣的朋友可以去围观一下。

  然后以下是我搭建toolchain遇到的问题和解决方法,向大家阐述一下。

  我们跟着google原创的一起来。

  一.

原文:Ensure that you have a copy of bison and flex installed on your system. All major systems should have these tools installed or available in package management systems.

$ bison --version 
GNU
Bison version 1.28 
$ flex
--version 
flex version
2.5.4

首先当然是检查bison和flex,没什么好说的,没有的朋友(debian apt-get)(red hat yum) (ubuntu wget)去下载,这里主要是留个备份。。给Linux和我一样菜的人。。。

 

  二.

原文:

  • Check out a copy of LLVM SVN, and build a release build (as opposed to a debug one). Currently, due to Issue 70, we are limited to revision 42498.
    $ svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm-svn -r 42498 
    $ pushd llvm
    -svn 
    $
    ./configure --enable-optimized 
    $ make ENABLE_OPTIMIZED
    =1 
    $ sudo make install 
    $ LLVMOBJDIR
    =`pwd` 
    $ popd
  • 检出一个llvm svn版本,听同事说,这个有现成的release版本,可以不需要编译源代码,但是为了保险起见,我们还是照着来吧。。
    -----------------分割线--------------------
    编译时的错误总结:
    1.我编译的时候,报了很多什么erro:"strlen" is not decalare还是什么,可能单词有错误。。。就是说strlen没有声明的问题。
    解决办法:去报错的头文件或c文件中,加上特定的头文件,再编译即可。(例如上面就需要添加#include <cstring>)
    三.
    原文:
  • Check out a copy of the iphone-dev SVN repository.
    $ svn checkout http://iphone-dev.googlecode.com/svn/trunk/ iphone-dev 
    $ pushd iphone
    -dev
  •  

    检出开发环境。需要一会。
    四.
    原文:
    • Make a directory to hold the toolchain.
      $ sudo mkdir /usr/local/arm-apple-darwin
    • Build odcctools.
      $ mkdir -p build/odcctools 
      $ pushd build
      /odcctools 
      $
      ../../odcctools/configure --target=arm-apple-darwin --disable-ld64 
      $ make 
      $ sudo make install 
      $ popd
    这里一般不会出错。好了,以上几点一般有点linux基础的人都能很快的做到这里来,下面即将是重点,并且也是写这篇文章的目的。
    五.
    原文:
    Get a copy of the iPhone root filesystem. This is usually obtained by decrypting and extracting the iPhone restore software using these tools, but there are many other methods to obtain this, including simply using scp to download all the files from the iPhone over Wi-Fi. Unpack the root filesystem somewhere, and set the environment variable $HEAVENLY to its path.
  • $ HEAVENLY=/usr/local/share/iphone-filesystem
  • 这段话的意思呢,就是说,需要你拷贝一份iphone的根文件系统放到上面的目录,我开始看到这里,就糊里糊涂的用91将iphone (我的是3GS)上所有的文件拷贝下来,拷了我几个小时啊,并且最后还不能用,崩溃。
    最后google了会,别人用的竟然是一个filesystem的压缩包,然后我就去网上下,最后不负苦心人,让我找到了,也是使用这个包编译通过的。
    六.
    原文:
    只有如果你正在leopard 10.5上编译,这是一个不好的编译toolchain的解决方法而且系统会给你一个警告
    这里不会出什么问题。
    九.
    原文:
  • Configure and make LLVM-GCC. Make sure that $LLVMOBJDIR and $HEAVENLY are set per the instructions above.
    $ mkdir -p build/llvm-gcc-4.0-iphone 
    $ pushd build
    /llvm-gcc-4.0-iphone 
    $
    ../../llvm-gcc-4.0-iphone/configure --enable-llvm=`llvm-config --obj-root` / 
    --enable-languages=c,c++,objc,obj-c++ --target=arm-apple-darwin --enable-sjlj-exceptions / 
    --with-heavenly=$HEAVENLY --with-as=/usr/local/bin/arm-apple-darwin-as / 
    --with-ld=/usr/local/bin/arm-apple-darwin-ld --enable-wchar_t=no 
    $ make LLVM_VERSION_INFO
    =2.0-svn-iphone-dev-0.3-svn  
    $ sudo make install 
    $ popd 
    $ popd
  • 马上就要成功了。首先确保LLVMOBJDIRHEAVENLY 是有值的,可以输入echo $LLVMOBJDIR 确认一下,如果发现是空,可以重新定义一遍,如果没问题了,就可以开始编译了
    但是相信大部分人,到这里,是会失败的,除非你一开始就照着这个来。
    编译的时候,会报一个错,解决方法,就是将/Developer/SDKs/MacOSX10.4u.sdk/usr/include 备份一下,然后删掉include,然后创建一个空的include 文件夹,并且重新安装头文件。然后再编译即可通过。
    cheers

    • Install the iPhone headers to the appropriate place. If you aren't on Mac OS X, replace the /Developer/SDKs/MacOSX10.4u.sdk path with the full path to the unpacked Mac OS X 10.4 Universal SDK. If you don't have a copy of this, see below.
      $ pushd include 
      $
      ./configure --with-macosx-sdk=/Developer/SDKs/MacOSX10.4u.sdk 
      $ sudo bash install
      -headers.sh 
      $ popd
    这里又是一个关键点了。第5点还好说,我可以去iphone上拷系统,可这个咋整的,第一印象就是,完了,我得把mac系统拷来???
    --------------------分割线--------------------------
    问题说明:
    因为google的人一直没有对这篇文章进行维护,所以他提供的方法,其实大部分是基于iphone 2.0或以前的,但是现在基本上找不着还有开发2.0的人吧。。。。
    所以,方法需要变通。其实在找到解决方法之前,我还是傻不拉几拷了份系统扔去编译过,没通过。然后后来google了一下,原来此文件是需要从xcode安装包中抓出来。
    然后我就从镜像里得pakage中抓出来了,发现是一个pkg包(app现在的包都是以这种格式来存放的),然后照着网上另一篇文章,来解压他,发现又不通。。。
    解决办法:
    1.相信大家手中都有xcode sdk镜像吧,无论是dmg或者iso也好,都行,使用UltraISO就可以打开他们。我的镜像是xcode 3.1.3.然后在pakage中找到MacOSX10.4u.pkg
    2.拿到pkg之后,我们需要解压才能生成sdk文件夹,在linux下,需要xar,可以去网上下一个,然后使用xar解压pkg,会生成4个压缩包,但是还是没有发现我们所需的sdk文件夹,使用zcat Payload | cpio -i,解压其中的payload压缩包,就会生成sdk文件夹了。
    七.
    原文:
    Install csu, which includes crt1.o, dylib1.o, and bundle1.o. Don't rebuild them from source, as this requires a working cross-GCC, which you don't have yet (and the build-from-source process for csu is broken right now anyway). Binaries are provided for this reason.
    • $ mkdir -p build/csu 
      $ pushd build
      /csu 
      $
      ../../csu/configure --host=arm-apple-darwin 
      $ sudo make install 
      $ popd
    没什么好说的。
    八.
    原文
  • Only if you are compiling on leopard 10.5. This is an ugly workaround and compiling with the resulting toolchain will give you a warning.
    $ mv llvm-gcc-4.0-iphone/configure llvm-gcc-4.0-iphone/configure.old 
    $ sed
    's/^FLAGS_FOR_TARGET=$/FLAGS_FOR_TARGET=${FLAGS_FOR_TARGET-}/g' /  
    llvm
    -gcc-4.0-iphone/configure.old > llvm-gcc-4.0-iphone/configure 
    $
    export FLAGS_FOR_TARGET="-mmacosx-version-min=10.1" 
    $ sudo ln
    -s /usr/local/arm-apple-darwin/lib/crt1.o / 
    /usr/local/arm-apple-darwin/lib/crt1.10.5.o