在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

目录
相关文章
|
2月前
|
安全 Linux Shell
Linux上执行内存中的脚本和程序
【9月更文挑战第3天】在 Linux 系统中,可以通过多种方式执行内存中的脚本和程序:一是使用 `eval` 命令直接执行内存中的脚本内容;二是利用管道将脚本内容传递给 `bash` 解释器执行;三是将编译好的程序复制到 `/dev/shm` 并执行。这些方法虽便捷,但也需谨慎操作以避免安全风险。
160 6
|
3月前
|
网络协议 Linux
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
567 2
|
3月前
|
Linux Python
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
64 2
|
17天前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
63 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
20天前
|
Linux 编译器 C语言
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
|
21天前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
28 1
|
3天前
|
Linux
Linux - 如何编译源码安装软件
源码编译安装通常包括三个步骤:1) `./configure` 检测平台特征和依赖项,生成 Makefile;2) `make` 编译源码,生成可执行文件;3) `make install` 将可执行文件安装到指定目录并配置环境变量。
10 0
|
25天前
|
Linux 编译器 C语言
Linux c/c++之多文档编译
这篇文章介绍了在Linux操作系统下使用gcc编译器进行C/C++多文件编译的方法和步骤。
35 0
Linux c/c++之多文档编译
|
2月前
|
消息中间件 分布式计算 Java
Linux环境下 java程序提交spark任务到Yarn报错
Linux环境下 java程序提交spark任务到Yarn报错
37 5
|
20天前
|
Linux 开发工具
【Linux快速入门(二)】Linux与ROS学习之编译基础(make编译)
【Linux快速入门(二)】Linux与ROS学习之编译基础(make编译)