在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看到的該程序的信息:
此外還提供了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