看到了一篇关于Android上利用终端来使用gcc编译C/C++源程序的文章,我感到无比兴奋,所以立刻将我自己的安装过程记下来。那个后记也很有用的。

gcc编译源代码需要创建临时文件,而gcc又只能安装在手机内存中使用(因为需要755权限),因此必须使用root来调用它。

测试手机:xiaomi note

1、下载gcc plugin for C4Droid https://www.cr173.com/soft/757968.html,解压其中的gcc文件夹出来,里面有基本的编译工具。如果要使用Qt,则将qt文件夹中的gcc和上述gcc文件夹合并即可。

2、将gcc文件夹复制到/system或/data文件夹中,但不能是/dev或/cache中。如果为了美观,也可以将gcc文件夹的权限改为755。假设安装到了/system中。

3、在gcc根目录下创建一个用于修改文件权限的脚本chgmod.sh,内容:

echo 1..
chmod 755 ./bin/*
chmod 755 ./arm-linux-androideabi/bin/*
chmod 755 ./libexec/gcc/arm-linux-androideabi/4.7.1/*
echo 2..

4、再创建一个用于设置gcc环境变量的脚本setgcc.sh,内容:

echo 1..
export GCCHOME=/data/gcc
export GCCPATH=$GCCHOME/bin:$GCCHOME/arm-linux-androideabi/bin:$GCCHOME/libexec
export PATH=$PATH:$GCCHOME:$GCCPATH
echo 2..
su
echo 3..

5、修改以上文件属性为755。

6、尝试先写一个源程序test.c,内容:

#include <stdio.h>

int main(void)
{
  printf("success\n");
  return 0;
}

7、安装Android上的终端程序,我用的是BTEP。

8、在终端中输入命令(顺序不可变),获取root权限:

su

切换目录:

cd /system/gcc

执行脚本,修改权限(只需运行一次,以后可跳过):

./chgmod.sh

设置gcc环境变量:

./setgcc.sh

这个脚本执行后将会再次进入su,为的是使export设置的变量继续生效。退出后会有提示。

如果终端没有报错,则继续,否则检查脚本内容里的目录是否正确。

9、输入:

gcc -Wall -o test test.c

如果终端报错,回到本文开头重新看过,看看是本文错了还是自己写错脚本了;

如果gcc报错,不关我的事,戴上眼镜看看源程序是不是错了。

待gcc输出一大包字符后,完成编译。

10、输入:

./test

error: only position independent executables (PIE) are supported.

需要采用pie编译

LOCAL_CFLAGS += -pie -fPIE

LOCAL_LDFLAGS += -pie -fPIE

如:gcc -Wall -pie -fPIE -o test test.c


后记:

写了一大包,不就是写如何设置环境变量和保持变量效果的问题嘛!有一个更好的方法,就是直接修改手机根目录下的init.rc文件:

1、用RE的编辑器编辑init.rc,在此之前最好备份。

2、找到有一大堆export的那部分,在那部分的最后添加:

export GCCHOME=/data/gcc
export GCCPATH=$GCCHOME/bin:$GCCHOME/arm-linux-androideabi/bin:$GCCHOME/libexec
export PATH=$PATH:$GCCHOME:$GCCPATH

3、保存退出,出现错误 Read-only file system, 使用命令mount -o remount,rw / 修改init.environ.rc,在最后添加环境数据,修改并保存再umount /

最新文章

  1. SSH:Struts2.2+Hibernate3.6+Spring3.1分页示例[转]
  2. mybatis的批量删除
  3. calico docker 应用实例
  4. iOS之UI--关于modal
  5. PHP数组的交集array_intersect(),array_intersect_assoc(),array_inter_key()函数详解
  6. 用 VeraCrypt 加密闪存盘
  7. hdu 4027 Can you answer these queries? 线段树
  8. hive环境的搭建
  9. UI表单
  10. 工作总结:MFC使用Windows自带打开对话框
  11. 高性能的JavaScript--加载和执行[转]
  12. MarkDown 学习笔记
  13. Linux查看设备命令
  14. js算法初窥07(算法复杂度)
  15. 无实体反序列化Json
  16. Python---高级函数map, filter, zip, enumerate等的用法
  17. 超简单Mac安装Tomcat服务器
  18. Linux服务器性能评估
  19. [Agc005D]K Perm Counting
  20. 深入web开发之webserver/servlet容器

热门文章

  1. pandas tutorial
  2. 物联网大赛 - Android学习笔记(三)Android 事件处理
  3. CF612E Square Root of Permutation
  4. 安装uiautomator2 + python 自动化环境
  5. 初识python 之 取101到200之前的所有素数
  6. spring boot &amp; maven 多模块 ---心得
  7. Web发送邮件
  8. stm32单片机利用ntc热敏电阻温度转换公式C语言版
  9. Presto 在字节跳动的内部实践与优化
  10. Linux驱动实践:中断处理函数如何【发送信号】给应用层?