当前位置: 首页 > article >正文

如何使用交叉编译器调试C语言程序在安卓设备中运行

一、前言

随着移动设备的普及与技术的飞速发展,越来越多的开发者面临着在Android设备上运行和调试C语言等程序的需求。然而,在软件开发的世界里,不同硬件架构对程序运行的要求千差万别,这无疑增加了开发的复杂性。特别是在移动计算领域,Android设备以其多样的硬件架构和操作系统版本而著称,包括ARM、x86、MIPS等多种处理器架构,每种架构都拥有独特的指令集和硬件特性。

传统的编译器是为特定主机平台设计的,能够生成在该平台上直接运行的二进制代码。但是,当开发者希望将C语言等编写的程序部署到与自己开发环境不同的Android设备上时,问题就变得复杂了。为了解决这个问题,交叉编译器应运而生。

交叉编译器是一种强大的工具,它能够在一种架构的计算机(即主机,如PC或其他高性能计算设备)上编译出另一种架构(即目标,如Android设备)的二进制代码。这种能力使得开发者可以在熟悉的开发环境中编写和编译代码,然后将生成的可执行文件传输到目标Android设备上运行。这种方式不仅显著提高了开发效率,还避免了直接在目标设备上编译代码可能带来的性能瓶颈和不便。

简而言之,交叉编译器是连接开发者与目标Android设备之间的桥梁,它使得在多样化的硬件架构上部署C语言程序成为可能。接下来,就让我们一起来深入了解如何在Android设备上运行C语言程序。

二、 安装交叉编译工具链

为了编译使用于Android设备的C语言程序,我们需要一个交叉编译工具链,它能够生成与Android设备架构相匹配的二进制文件。下面是详细的安装步骤:

2.1 下载交叉编译工具链

对于不同架构的Android设备,我们需要选择相应的交叉编译工具链。例如,如果我们的目标设备是ARM64架构,我们可以选择gcc-aarch64-linux-gnu,它是由Linaro公司基于GCC(GNU Compiler Collection,GNU编译器集合)推出的,专门用于在一种架构的系统上编译生成适用于另一种架构(这里指ARM64)的可执行文件。

  • 交叉编译官方下载地址
    GNU官方网站: https://gcc.gnu.org/
    Linaro官方网站: https://www.linaro.org/
    Ubuntu软件仓库: 如果我们使用的是ubuntu或基于Ubuntu的Linux发行版,我们则可以通过Ubuntu的软件仓库来安装。例如安装gcc-aarch64-linux-gnu交叉编译器,如下:
    $ sudo apt-get install gcc-aarch64-linux-gnu
    

2.2 解压并配置环境变量

当我们下载完成后,需要解压工具链文件,并将其bin目录添加到我们的系统PATH环境变量中。

注:使用Ubuntu软件仓库下载的交叉编译工具链文件不需要我们配置环境变量,因为ubuntu已经帮我们配置好了。

  • 解压工具链文件
    1. 在Linux终端中找到我们下载交叉编译工具链的目录。
    2. 使用tar命令解压交叉编译工具链文件。例如,如果我们的工具链文件是gcc-aarch64-linux-gnu-4.5.1.tar.bz2,我们可以使用以下命令解压
      $ tar  -xvf  gcc-aarch64-linux-gnu-4.5.1.tar.bz2
      
    3. 解压后,我们将看到一个包含bin目录的文件夹。
  • 配置环境变量
    1. 将解压后的bin目录添加到你的系统PATH环境变量中。我们可以通过修改~/.bashrc/etc/bash.bash.rc/etc/profile/etc/environment等文件来实现。例如,如果我们选择修改~/.bashrc文件,我们可以使用文本编辑器打开该文件,并在行尾添加以下命令:
      export PATH=/path/to/your/toolchain/bin:$PATH 
      # 注:(/path/to/your/toolchain/bin替换为我们工具链bin目录的实际路径)
      
    2. 保存并关闭文件后,使用source命令使修改生效。例如,如果我们修改了~/.bashrc文件,可以使用source ~/.bashrc命令。

在配置环境变量时,我们需要注意以下几点:

  • 选择合适的文件: 根据你的需求选择合适的文件来修改环境变量。如果我们希望修改只对当前用户生效,可以选择~/.bashrc;如果我们希望修改对所有用户生效,可以选择/etc/profile或/etc/environment。
  • 避免覆盖原有PATH: export PATH=/path/to/your/toolchain/bin:$PATH这条命令的作用是将一个新的目录(这里是/path/to/your/toolchain/bin)添加到PATH环境变量的前面,同时保留原有的PATH值。这里的$PATH表示原有的PATH环境变量的值。因此,执行这条命令后,当我们在命令行中输入一个命令时,系统会首先在我们新添加的目录(/path/to/your/toolchain/bin)中查找可执行文件,如果找不到,再按照原有的PATH值中的目录顺序继续查找。这样,我们就可以在不改变原有系统环境的情况下,方便地添加新的可执行文件搜索路径,从而使用我们安装的交叉编译工具链了。
  • 立即生效: 使用source命令可以使修改立即生效,而无需重启计算机。

完成以上步骤后,我们就可以在命令行中直接使用交叉编译器了。我们可以通过输入交叉编译器的名称(如 aarch64-linux-gnu-gcc)并按下Tab键来检查是否已成功添加到PATH中。如果命令行显示了相关的命令提示,则说明配置成功。

三、编写C语言程序

现在我们开始编写我们想要在Android设备上运行的C语言程序,如下。

#include <stdio.h>
 
int main() {
    printf("Hello Android\n");
    return 0;
}

在这里插入图片描述

四、交叉编译C程序

打开我们的命令行界面,使用交叉编译器命令来编译我们的C程序。

 aarch64-linux-gnu-gcc  test.c -o test -static
 # 注意: -static是必须的,安卓平台不支持动态编译C代码。-static选项确保将所有必要的库静态链接到我们的程序中,从而避免在Android设备上出现运行时动态链接库的问题。
# which aarch64-linux-gnu-gcc //查看编译器的路径

在这里插入图片描述

五、 将可执行文件传输到Android设备

  • 步骤1: 连接Android设备
    使用USB线将我们的Android设备连接到电脑上,并确保设备已开启USB调试模式。

  • 步骤2:使用adb工具传输文件
    使用adb工具将我们的可执行文件传输到Android设备的某个目录中。例如,我们可以将其传输到/data/local/tmp目录(这个目录通常对USB调试模式下的设备是可写的):

    adb push test  /data/local/tmp/
    

六、 在Android设备上运行程序

现在,我们可以通过adb shell进入我们的Android设备的命令行界面,并运行我们的程序。

注:确保我们拥有执行权限

  • 步骤1:进入adb shell

    在命令行中输入以下命令来进入我们的Android设备的shell:

    adb shell
    
  • 步骤2:进入到可执行文件所在的目录
    使用cd命令导航到我们之前传输可执行文件的目录。例如:

    cd /data/local/tmp/
    
  • 步骤3:运行程序

    现在,我们可以运行程序了。输入以下命令:

    # chmod 777 test
    # ./test
    

    这样我们就会看到在adb界面出现Hello Android字样了!
    在这里插入图片描述


http://www.kler.cn/a/463898.html

相关文章:

  • 个人健康信息系统|Java|SSM|VUE| 前后端分离
  • Spring Cloud Security集成JWT 快速入门Demo
  • Flutter中的网络请求图片存储为缓存,与定制删除本地缓存
  • 机器学习之模型评估——混淆矩阵,交叉验证与数据标准化
  • 弧形导轨如何避免生锈?
  • 超高分辨率 图像 分割处理
  • 计算机网络原理(谢希仁第八版)第3章课后习题答案
  • vscode ssh远程连接已配置好仍然不能自动登录问题解决
  • java的bio、nio、aio 以及操作系统的select、poll、epoll
  • 【开源免费】基于SpringBoot+Vue.JS校园社团信息管理系统(JAVA毕业设计)
  • 解决表格数据量大时ie浏览器卡顿
  • Python中PDF转Word的技术
  • web课程设计--酷鲨商城-springboot和vue
  • Solon 加入 GitCode:助力国产 Java 应用开发新飞跃
  • OpenGL入门最后一章观察矩阵(照相机)
  • 【2024年-6月-14日-开源社区openEuler实践记录】探索 test - tools:高效测试的开源宝库
  • 电子电器架构 --- 自动驾驶技术中的LiDAR
  • windows编译llama.cpp GPU版本
  • Java Web开发基础——Java Web项目中的MVC设计模式
  • Leetcode打卡:二叉树中的链表
  • C++进阶重点知识(一)|智能指针|右值|lambda|STL|正则表达式
  • 《深入浅出HTTPS​​​​​​​​​​​​​​​​​》读书笔记(23):密钥协商算法(续)
  • ChatGLM2-6B模型推理流程和模型架构详解
  • SpringBoot_第二天
  • 机器学习中回归预测模型中常用四个评价指标MBE、MAE、RMSE、R2解释
  • 【从零开始入门unity游戏开发之——C#篇38】C#预处理器指令