在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看到的该程序的信息:

此外还提供了ios-createProject用于创建一个项目,只要运行make就能编译了。ios-xcbuild用于转换xcodeproj为makefile,或者直接基于xcodeproj进行构建。

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

时间: 2024-09-30 16:26:14

在Linux上编译iOS程序的相关文章

如何在Kali Linux上编译Windows漏洞!

Mingw-w64是一个用于创建Windows应用程序的自由和开源软件开发环境. Mingw-w64最初叫Mingw32,它当时不支持64位架构. 在本教程中,我们将讨论如何使用Mingw-64在 Kali Linux上编译Windows漏洞. 让我们开始在Kali Linux上安装Mingw-w64. 1.在Kali Linux上安装Mingw-w64 默认情况下,Kali Linux 2016.2和更低版本上未安装Mingw-w64. 因此,我们需要先安装它,然后才能在Linux上编译Win

linux-qt上编译opencv程序出错

问题描述 qt上编译opencv程序出错 编译提取棋盘格角点的的程序,但是一直显示cvFindChessboardCorners这个函数有问题,请大神指教! 错误如下: ../qt_subpix1/main.cpp: In function 'int main(int, char**)': ../qt_subpix1/main.cpp:14:19: warning: deprecated conversion from string constant to 'char*' [-Wwrite-st

如何自己搭建一个android SDK?(利用linux上编译出来的东西)

问题描述 如题,因为自己改动了一些android原生的类,另外加入了一些style,已经在linux上编译通过.因为现在要在windows上开发其他模块,需要利用此改动后的framework.请问如何build一个android的SDK,使其能在windows上eclipse中使用呢? 问题补充:AngelAndAngel 写道 解决方案 在linux下使用make编译:make sdk解决方案二:你直接导出包 然后放在eclipse的默认存储包里面就行了啊. 它不是自己带一些包吗 你放里面就可

在vs2008上编译的程序在别的机器上运行出现错误如下

问题描述 在vs2008上编译的程序在别的机器上运行出现错误如下 sxstrace.exe之后结果如下 开始生成激活上下文. 输入参数: Flags = 0 ProcessorArchitecture = x86 CultureFallBacks = zh-CN;zh-Hans;zh;en-US;en ManifestPath = F:crowd exeTheaterSimulatorBinTheaterSimulator.exe AssemblyDirectory = F:crowd exeT

iOS开发入门:如何编译iOS程序

我们从编写到发布应用会经历3个阶段:模拟器上运行调试.设备上运行调试和发布编译,苹果为了防止非法设备和非开发人员调试和发布应用,使用配置概要文件(Provisioning Profiles)控制在设备上运行调试和发布编译阶段,配置概要文件分为两种:开发配置概要文件和发布配置概要文件 1.创建发布配置概要文件 创建过程是先登录iOS开发中心的配置门户网站(iOS Provisioning Portal),通过左边的导航菜单Provisioning进入.选择Distribution标签就是管理发布配

自己在linux上编译、链接、动态库和静态库的学习笔记

在平常的项目中,我们都是使用公司要求的makefile.makedebug一类的文件,因此,在编译.链接.生成和链接动态库与静态库的时候,我们只是简单的使用一些已经设置的变量,只是简单的修改.添加一些文件名,或许这次我们编译通过了,但是,在某一个时候,可能出现了一个问题,无论简单与否,因为平常没有留意,导致的结果可能是花了好长时间才能解决.而如果平常只是简单的留一下心,或许这些问题都是可以避免的. 因此,今天我自己使用几个文件,编译动态库.静态库以及动态库和静态库的嵌套调用等问题,尽量还原我在项

iOS开发那些事-如何编译iOS程序

我们从编写到发布应用会经历3个阶段:模拟器上运行调试.设备上运行调试和发布编译,苹果为了防止非法设备和非开发人员调试和发布应用,使用配置概要文件(Provisioning Profiles)控制在设备上运行调试和发布编译阶段,配置概要文件分为两种:开发配置概要文件和发布配置概要文件 1.创建发布配置概要文件 创建过程是先登录iOS开发中心的配置门户网站(iOS Provisioning Portal),通过左边的导航菜单Provisioning进入.选择Distribution标签就是管理发布配

如何在linux上构建objective-c程序

    swfit目前还是os x独占,以后会不会扩展到其他系统还未可知,但objective-c并不只存在于os x,在linux下gcc和clang都支持obj-c哦,下面简单把如何在ubuntu上构建obj-c做一下说明: 1 安装obj-c或obj-c++(如果需要的话)所需库:   * build-essential     * gobjc     * gobjc++     * gnustep-devel  直接用apt-get install 搞定吧 :) 2 用经典的hello

[cocos2dx]windows上编译安卓程序

首先在exclipe上配置好java的jdk1.6或更高,配置好android环境(最好有android2.1或2.2以及更高版本的sdk). 在下载个ndk,ndk解压后先放到一边,cygwin,解压后,sygwin解压安装会比较久大概4-5个小时,如果解压安装成功, cygwin安装过程请参考http://wenku.baidu.com/view/88b001ef4afe04a1b171de05.html看到第三步就行了,接下来继续看 安装好cygwin后验证下是否成功打入(注意空格)mak