閱讀278 返回首頁    go 阿裏雲 go 技術社區[雲棲]


在Linux上編譯iOS程序

phpwind appcreator是向站長提供的自助app生成平台,目前隻支持Android,為了支持iOS,搜了一些相關資料,發現可以在Linux上來編譯iOS程序,但最後的簽名什麼的還沒細究。

主要用到了一些cjacker移植的工具鏈(應該是基於蘋果公司開源的一些代碼),以及他開發的iphonesdk-utils(主要是一些輔助工具,比如ios-clang,會探測iPhone SDK,並自動加上一些參數來調用clang,避免自己手寫很多參數,比如 --target 等)。

介紹下具體步驟:

  • 首先需要安裝一些基礎庫和工具,主要是uuid、icu、sqlite3、flex、bison。一般這些通過係統的包管理工具安裝就行了。uuid等那幾個庫需要開發相關的文件,也就是一些頭文件和動態鏈接庫,這個在一般的Linux發行版中是拆開的,至於名字則和具體發行版有關,比如openSUSE中uuid的開發包就是libuuid-devel

  • 安裝llvm和clang,版本需要>=3.7.0。較低版本的clang,發現無法正確找到交叉編譯需要的ld,總是調用了係統中binutils提供的/usr/bin/ld。按照這個頁麵的提示,我們隻要下載llvm和clang就行了,其他用不到。先安裝llvm,再安裝clang,建議在cmake時將CMAKE_INSTALL_PREFIX指向單獨的目錄位置,避免和係統默認的衝突,比如可以指向HOME/local,這裏的HOME指的是用戶主目錄,然後將HOME/local/bin添加到PATH開頭的位置就行了。llvm編譯產生的中間文件居然有8.8G這麼大。。

  • 下載cctools:

svn co https://ios-toolchain-based-on-clang-for-linux.googlecode.com/svn/trunk/cctools-porting

需要改一下裏麵的其中一個文件內容:

sed -i 's/proz -k=20  --no-curses/wget/g' cctools-ld64.sh

其實就是把下載工具proz替換為wget。

除此之外,還需要把/usr/include/unistd.h這個文件中其中一個函數參數的__block改掉,因為後麵要用clang編譯cctools,__block被clang保留使用了,可以改成__libc_block

然後是導出兩個環境變量:

export CFLAGS="-IHOME/local/include/llvm-c" && export CXXFLAGS="-IHOME/local/include/llvm-c"

這裏的HOME要替換成你編譯llvm時指定的前綴。

然後就是configure和編譯了。

CC=clang CXX=clang++ ./configure --prefix=HOME/local/ --target=arm-apple-darwin11
make && make install

這個編譯比較簡單:

CC=clang CXX=clang++ ./configure --prefix=HOME/local/
make && make install
  • 從其他mac機器上拷一個iPhone SDK過來,放到/usr/share下麵,SDK的路徑一般是/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/目錄下麵,比如這下麵的iPhoneOS8.4.sdk。 或者可以下載一個,當然下載的不知道是否安全。。

  • 接下來就可以編譯iOS程序了,比如一個簡單的:

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface MyDelegate : UIResponder< UIApplicationDelegate >
@end

@implementation MyDelegate
- ( BOOL ) application: ( UIApplication * ) application
           didFinishLaunchingWithOptions: ( NSDictionary * ) launchOptions {
  UIWindow *window = [ [ [ UIWindow alloc ] initWithFrame:
    [ [ UIScreen mainScreen ] bounds ] ] autorelease ];
  window.backgroundColor = [ UIColor whiteColor ];
  UILabel *label = [ [ UILabel alloc ] init ];
  label.text = @"Hello, World!";
  label.center = CGPointMake( 100, 100 );
  [ label sizeToFit ];
  [ window addSubview: label ];
  [ window makeKeyAndVisible ];
  [ label release ];

  return YES;
}
@end

int main( int argc, char *argv[ ] )
{
  UIApplicationMain( argc, argv, nil, NSStringFromClass( [ MyDelegate class ] ) );
}

保存為window.m,編譯隻要運行:

ios-clang -framework Foundation -framework UIKit window.m -o window

就行了。

這是通過llvm看到的該程序的信息:

screen27

此外還提供了ios-createProject用於創建一個項目,隻要運行make就能編譯了。ios-xcbuild用於轉換xcodeproj為makefile,或者直接基於xcodeproj進行構建。

參考:
[1] https://stackoverflow.com/questions/28085052/compile-ios-program-from-linux-commandline

最後更新:2017-04-01 13:37:10

  上一篇:go redis slaveof自己會發生什麼
  下一篇:go redis lua原理分析