开发者社区> idealities> 正文

在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 http://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] http://stackoverflow.com/questions/28085052/compile-ios-program-from-linux-commandline

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
《Objective-C高级编程:iOS与OS X多线程和内存管理》读后感
拿到这本书的第一感觉是非常薄,但是内容就如同序里面所说,这不是一本面向初学者的书,比较有深度,对C/C++完全不熟悉的话很多东西会看不明白。 虽然此书在技术点上只谈到了ARC、Blocks和GCD,但是如果把这三部分的内容深入理解了,其实也等于将开发中大部分的问题都解决了,ARC面对的是内存管理的问题,相信每一个iOS开发者都曾面临过,对大多数人来说,只要记好内存管理的相关规则,就能避免内存管理的问题,如果不满足于只知其表象,想深入理解ARC的工作机制的话,这部分还是很值得一读的。
948 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
19696 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
17986 0
+关注
idealities
https://github.com/ideal
14
文章
66
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载