android 下运行linux-c 文件

本文介绍如何在Android设备上运行由GCC静态编译的C程序。通过使用安卓虚拟器和Linux开发环境,创建并编译一个简单的hello-world程序,然后将其推送到安卓模拟器的数据文件夹中,修改权限并运行,最终实现在Android上运行GCC编译的程序。

因为andorid是基于linux开发的,所以理论上android应该可以运行gcc-make生成的二进制文件。实验方法如下:

1.准备材料: 安卓虚拟器(海马玩,雷电等)或安卓实体机。

2.Linux开发环境。(VMware虚拟安装Ubuntu12+ 等)

3. Linux下新建经典的hello.c文件

#include<stdio.h>

int main(void){

    printf("hello-world-for-android!\n");

    return 0;

}

4.然后用以下指令make一下生成hello二进制文件,android下的c函数库是bionic C标准库,而linux使用的是glibc,所以只能使用静态编译。gcc加-static。

gcc hello.c -o hello -static

5.将生成的hello文件拷贝到windows的D:\盘,然后启动海马玩模拟器,(注意需开启USB调试),再启动cmd窗口,用adb工具将hello文件push到模拟器里的data文件夹中,分别执行以下指令:(##后为解析无须输入)

adb push d:\hello /data       ##将hello文件拷贝到安卓模拟器

adb shell                             ##启动adb shell指令

chmod 777 /data/hello      ##修改hello为可执行权限

./data/hello                       ##运行hello,此时cmd上应该会显示:  hello-world-for-android!

PS: 顺便通过 cat /proc/version 查看android采用了哪个linux内核。

<think>我们面对的情况是:用户提供了一系列以 `aarch64-linux-android-` 为前缀的工具(如 addr2line、ar、as等),但缺少关键的编译器 `aarch64-linux-android-gcc`。用户希望在这种情况下寻找解决办法。 分析问题: 1. 在标准的交叉编译工具链中,`gcc` 是核心的编译器,没有它无法直接编译C代码。 2. 用户提供的列表中有 `aarch64-linux-android-gcc-ar`、`aarch64-linux-android-gcc-nm` 等工具,这些是gcc工具链的一部分,但并不是编译器本身。 3. 引用[3]中提到了使用 `aarch64-linux-gnu-gcc` 和 `aarch64-linux-gnu-g++` 来配置编译,这暗示了通常做法是需要有gcc的。 可能的解决办法: 1. **查找是否存在gcc的软链接或别名**:在Unix系统中,有时工具链中的编译器可能以不同的名字存在(比如版本号后缀),或者通过软链接指向实际的可执行文件。我们可以尝试在同一个目录下查找是否有类似 `aarch64-linux-android-gcc` 的文件,或者通过命令查找: ```bash ls -l /path/to/toolchain/bin | grep gcc ``` 如果发现类似 `aarch64-linux-android-gcc -> aarch64-linux-android-gcc-4.9` 的软链接,那么我们可以直接使用它。 2. **使用Clang替代GCC**:现代Android NDK默认使用Clang编译器,因此如果用户有Clang工具链,可以尝试使用Clang。对于ARM64目标,Clang编译器的命令可能是 `clang` 并配合 `--target=aarch64-linux-android` 参数。引用[2]中提到了一个软链接的例子,但它是针对GCC的,不过我们可以参考类似思路。 3. **安装缺失的工具链**:如果确实没有gcc,那么可能需要安装完整的工具链。用户可以通过下载Android NDK,然后使用其中的工具链。 4. **手动编译目标代码**:如果没有gcc,但是有汇编器(as)和链接器(ld),理论上可以手动编译,但这种方法极其繁琐,不推荐。 5. **检查环境变量PATH**:确保包含工具链的目录已经添加到PATH中,这样我们可以直接调用工具链中的命令(引用[5]展示了如何设置PATH)。 具体步骤建议: 步骤1:确认是否真的没有gcc 在工具链的bin目录下,运行: ```bash ls aarch64-linux-android-gcc* ``` 或者尝试: ```bash find . -name "aarch64-linux-android-gcc*" ``` 步骤2:如果确实没有gcc,考虑使用Clang 如果用户有Clang,可以这样设置: ```makefile CC = clang CFLAGS = --target=aarch64-linux-android -g -O2 ``` 注意:使用Clang时需要指定目标平台(通过`--target`)和sysroot(通过`--sysroot`)等参数。 步骤3:安装或获取完整的工具链 如果没有gcc,也没有Clang,那么需要下载Android NDK。可以从官网下载NDK,然后使用其中的工具链。例如,NDK r21e中的gcc工具链位于: `ndk-bundle/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/` 步骤4:使用build系统中的工具链 如果用户正在构建Android项目(如AOSP),那么可以通过环境设置脚本来设置工具链。例如,在AOSP环境中,执行`source build/envsetup.sh`和`lunch`后,环境变量中会包含正确的工具链路径。 步骤5:创建软链接(如果存在旧版本gcc) 如果目录中存在带有版本号的gcc,可以手动创建软链接。例如: ```bash ln -s aarch64-linux-android-gcc-4.9 aarch64-linux-android-gcc ``` 步骤6:使用其他工具链中的gcc(如果兼容) 如果其他工具链(如Linaro)中有aarch64的gcc,且目标系统是Android,那么可以尝试使用,但要注意库的兼容性问题。参考引用[5]中设置了Linaro工具链的路径。 总结: 核心思想是:没有gcc,要么找到它(通过查找、安装或创建软链接),要么用Clang替代。如果都没有,则需要获取完整的工具链。 根据引用[1],我们可以知道工具链通常位于类似`prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin`的目录下,因此用户应该检查该目录下是否有gcc。 因此,给用户的回答如下: </think>### 缺少 `aarch64-linux-android-gcc` 的解决方案 当只有 `aarch64-linux-android-` 系列工具但缺少 GCC 编译器时,可通过以下方法解决: #### 1. 定位现有工具链路径(关键第一步) ```bash # 使用 addr2line 定位工具链目录 find /path/to/prebuilts -name aarch64-linux-android-addr2line | xargs dirname ``` 执行后会返回类似结果: ``` /path/to/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin ``` 此目录即为工具链根目录(假设为 `$TOOLCHAIN_DIR`)[^1] #### 2. 查找编译器替代方案 在工具链目录检查是否存在: ```bash ls $TOOLCHAIN_DIR/aarch64-linux-android-gcc* 2>/dev/null ``` ##### 可能出现的情况: - **情况一:存在带版本号的 GCC**(如 `aarch64-linux-android-gcc-4.9`) 创建符号链接: ```bash cd $TOOLCHAIN_DIR ln -s aarch64-linux-android-gcc-4.9 aarch64-linux-android-gcc ``` - **情况二:存在 Clang 编译器** Android NDK 新版默认使用 Clang: ```bash # 设置 Clang 替代 GCC export CC=$TOOLCHAIN_DIR/clang make CFLAGS="--target=aarch64-linux-android -fPIC" ``` - **情况三:完全缺失编译器** 需额外安装: ```bash # 下载 Linaro GCC 工具链 wget https://releases.linaro.org/components/toolchain/binaries/7.3-2018.05/aarch64-linux-gnu/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu.tar.xz # 设置环境变量 export PATH="/opt/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin:$PATH" [^5] ``` #### 3. 手动编译工作流程 若需编译简单程序: ```bash # 汇编阶段 $TOOLCHAIN_DIR/aarch64-linux-android-as -o test.o test.s # 链接阶段 $TOOLCHAIN_DIR/aarch64-linux-android-ld -o test test.o ``` #### 4. NDK 兼容性方案 对于 Android 项目: ```bash # 在 Android.mk 中直接指定工具 LOCAL_CC := $(TOOLCHAIN_DIR)/aarch64-linux-android-as LOCAL_LD := $(TOOLCHAIN_DIR)/aarch64-linux-android-ld ``` > **注意事项**: > 1. 使用 `readelf` 验证二进制兼容性: > ```bash > $TOOLCHAIN_DIR/aarch64-linux-android-readelf -h your_binary | grep Machine > ``` > 应显示:`Machine: AArch64`[^4] > 2. 交叉编译时需指定 sysroot: > ```bash > clang --sysroot=$NDK/platforms/android-21/arch-arm64 > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值