内置 C/C++/Fortran 编译器 —— pip 能编译原生扩展的关键
为什么需要它
Python 的大多数库是纯 Python 写的,但一些高性能库(NumPy、SciPy、cryptography、lxml...)的核心部分是用 C/C++ 写的原生扩展——pip 安装时需要编译这些 C 代码才能用。
标准 pip 在普通 Android 上装这些库会卡在「找不到 C 编译器」这一步。Pydroid 的解法是直接把编译器打包进 App。
内置了什么
Pydroid 内置了一套完整的交叉编译工具链(针对 ARM Android 目标):
| 组件 | 版本/说明 |
|---|---|
| GCC (C 编译器) | 专为 Pydroid 定制,输出 ARM Android ELF |
| G++ (C++ 编译器) | 同上 |
| GFortran | Fortran 编译器(SciPy 依赖) |
| Make | 构建工具 |
| CMake | 跨平台构建系统 |
| 头文件 | C 标准库 + Python.h + 常见系统库头 |
| 链接器 | ld 等 binutils 工具 |
这套工具链的编译目标是 arm-linux-androideabi-gcc 风格的交叉编译器——编译出来的 .so 文件可以直接在 Android 的 ARM CPU 上运行。
它怎么被用到
当 pip 安装一个没有预编译 wheel 的包时:
- pip 下载源码包(
.tar.gz) - 解压后运行
setup.py build_ext或pyproject.toml里的 build 脚本 - build 脚本调用编译器工具链编译 C/C++/Fortran 源码
- 编译产物(
.so动态库)被拷贝到 Python 的 site-packages 目录
整个过程 Pydroid 自动处理,用户不需要手动调用 gcc。
Cython 支持
Pydroid 还内置了 Cython——一种把 Python 代码转写成 C 然后编译的加速工具。如果你的项目里有 .pyx 文件,Pydroid 可以编译它们。这在科学计算场景里很有用(加速热点函数)。
能用它做什么
除了装 Python 库之外,你还可以:
1. 编译独立的 C 程序
打开 Terminal,直接写一个简单的 C 文件,用 gcc 编译,然后运行生成的 .so:
cat > hello.c << 'EOF'
#include <stdio.h>
int main() { printf("Hello from C on Android!\n"); return 0; }
EOF
gcc -o hello.so hello.c -shared
2. 交叉编译需要的第三方 C 库
某些 Python 包的源码编译依赖外部 C 库(比如 OpenSSL、libffi)。Pydroid 内置了常用的几个,但不是全部。缺库时 pip 会在编译阶段报「找不到 xxx.h」——这种情况一般没法在 Pydroid 里解决。
限制
- 内置工具链的版本可能落后于桌面最新版(比如 GCC 8.x 而不是 14.x),某些需要新 C++ 特性的库可能编译失败
- 不是所有 C 标准库的头都有,极端定制化的编译需求可能踩坑
- 编译速度比桌面慢很多(手机 CPU + I/O 速度限制),大项目的源码编译可能需要几分钟甚至十几分钟