在iOS(iphone、ipad)上编辑、编译和运行c/c++(更新)


因为GCC在iOS上的种种问题,所以放弃了GCC采用Clang编译C/C++。

一、添加BigBoss源

一般cydia默认都带有BigBoss源,当然如果你删除了请添加回来,源地址:http://apt.thebigboss.org/repofiles/cydia/

二、安装LLVM+Clang、LD64和MTerminal

直接在cydia中搜索安装即可,注意LLVM+Clang文件会比较大。
cydia_LLVMClang.png
cydia_ld64.PNG
cydia_mterminal.PNG

三、导入头文件和链接库

iOS8的话可以点击这里下载,其他iOS版本没测试,理论上问题不太大。
将下载下来的压缩包放到iOS中的/var/root目录下(实际上可以随便放,不过后面还要用到这个路径),用iOS中的iFile(如果没有请到cydia安装)对压缩包解压:
usr_file

解压最后出现:
返回值:0

则表示解压成功,在/var/root目录下会出现usr文件夹。

这时点击usr文件夹右边的感叹号图标,将访问权限全部修改为“读取,写入,执行”:
ifile_usr.PNG

如果你有一台安装有XCode的Mac,可以到这里找到需要的文件夹:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/
最后的SDK选择自己需要的版本,压缩里面的usr文件。

四、设置Clang参数

因为Clang不会自带头文件和链接库,所以这里需要用参数指定,为了减小工作量直接写一个shell脚本。

在电脑上新建一个文本文档(当然也可以直接在iFile中新建),内容如下:

#!/bin/sh

clang++  -I /var/root/usr/include/c++/4.2.1/ -I /var/root/usr/include/ -L /var/root/usr/lib/ -L /var/root/usr/lib/system/  $*

保存后去掉文件的.txt后缀,命名为dpp,将文件放到iOS中的/usr/bin文件夹下,点击右边的感叹号图标,修改访问权限为“读取,写入,执行”:
ifile_dpp.PNG

五、编译并执行C++文件

这里可以在电脑上创建一个简单的.cpp文件(我的文件名字为test.cpp):

#include <iostream>
using namespace std;

int main(){
    cout<<"Hello World!"<<endl;
}

将文件放到/var/mobile文件夹下
打开MTerminal,输入:
dpp test.cpp -o test

如果没出现错误就是编译成功,接下来运行编译后的文件:
./test

就会得到:
Hello World!
mterminal.PNG
这样即完成了所有步骤。


下面是几点要说明的:

  1. 我在iOS6、iOS7、iOS8上均测试过能正常使用,一般不可能是LLVM+Clang和LD64的问题;
  2. 如果头文件和链接库文件(即usr文件夹)找不到对应的,可以参考这里去寻找;
  3. 注意千万不要在Windows下解压usr.zip后再传至iOS,因为NTFS格式磁盘会破快链接文件的文件格式;
  4. 一定要注意复制进iOS的文件和解压的文件的权限问题,这里直接全部设为“读取,写入,执行”避免权限问题;
  5. 如果前面的usr路径和我的路径不同,注意要同时修改shell脚本中的参数;
  6. 我的shell文件名为dpp,这里可以自由修改,在Terminal中执行时对应就行;
  7. 这个shell是用来编译C++的,若要编译C,只需要将其中的clang++更改为clang(可能后面的头文件参数路径也需要更改,我没有测试);
  8. dpp test.cpp -o testdpp是我自定义的指定编译和头文件链接文件的命令,test.cpp为需要编译的文件的文件名,-o test为指定编译后文件的文件名,这里我指定为test
  9. ./test即为执行test文件,这里的./为当前目录,必不可少,不同于Windows可以直接test

配合Texiastic会有更好的效果,参考这里:iOS8:利用Textastic帮助在iPhone上编辑和编译C/C++文件