Skip to content

mcpp 在 Android Termux(Bionic)上的编译困难问题 #143

Description

@npp-zep

平台信息

  • 设备:Android 手机(Termux 环境)
  • 架构:aarch64 (ARM64)
  • 内核:Linux 4.14.113-perf
  • 编译器:Clang 21.1.8-2
  • 其他工具:CMake 4.3、Ninja 1.13

实际尝试过程

尝试一:用 CMake 编译 mcpp 主项目

git clone https://github.com/mcpp-community/mcpp.git
cd mcpp
mkdir build && cd build
cmake ..

结果:卡在依赖解析阶段,报错找不到 mcpplibs.cmdline

Could not find a package configuration file provided by "mcpplibs_cmdline"

尝试二:单独编译依赖 mcpplibs.cmdline

git clone https://github.com/mcpplibs/cmdline.git
cd cmdline
xmake build

结果:xmake 构建失败,提示找不到 C++23 标准库模块

error: <cmdline> missing std dependency for module mcpplibs.cmdline
warning: std and std.compat modules not found!

尝试三:直接用 xmake 编译 mcpp

cd mcpp
xmake build

结果:同样因为缺少标准库模块而失败

问题本质

  1. mcpp 完全依赖自举(用 mcpp 自己编译自己),但在 aarch64 Linux 上没有预编译二进制可供引导
  2. 依赖 mcpplibs.cmdline 同样依赖 mcpp 或完整的 C++23 标准库模块支持
  3. Termux 上的 Clang 21.1.8 虽然版本够新,但 import std 所需的标准库预编译模块(BMI)默认未配置,导致模块项目无法构建

环境信息

$ uname -a
Linux localhost 4.14.113-perf-g10d8b3509-dirty #1 SMP PREEMPT Mon Sep 1 21:28:33 CST 2025 aarch64 Android

$ clang++ --version
clang version 21.1.8
Target: aarch64-unknown-linux-android24
Thread model: posix
InstalledDir: /data/data/com.termux/files/usr/bin

$ pkg list-installed | grep -E "clang|llvm|cmake|ninja"
clang/stable,now 21.1.8-2 aarch64 [installed]
cmake/now 4.3.0 aarch64 [installed,upgradable to: 4.3.4]
libllvm/stable,now 21.1.8-2 aarch64 [installed]
llvm/stable,now 21.1.8-2 aarch64 [installed]
ninja/stable,now 1.13.2 aarch64 [installed]

Activity

  1. tz12323 commented on Jun 22, 2026

    @tz12323

    部分cmake版本较低,无法编译module,可能需要更高版本的cmake,或者换用make会拥有更好的跨平台编译能力。

  2. npp-zep commented on Jun 22, 2026

    @npp-zep
    Author

    谢谢回复。不过我用的 CMake 是 4.3.0,版本其实够高了。换 Make 可能也解决不了,因为问题出在更底层。我在 Termux 里直接用 clang++ -std=c++23 编译 import std; 就报错 module 'std' not found,根本还没用到 CMake 或 Make。

  3. tz12323 commented on Jun 22, 2026

    @tz12323

    我检查了一下termux的../usr/下的文件夹,里面没有发现std.cppm 或者std.cc等文件,无法手动编译std module。也许从llvm对应的版本中下载std.cppm std.compat.cppm然后手动编译,并且在使用cmake编译时链接这个moudle或许可以解决这个问题。

  4. npp-zep commented on Jun 22, 2026

    @npp-zep
    Author

    我按照你的建议尝试了以下步骤:

    1. 从 LLVM 21.1.8 源码包中查找 std.cppm

      • 下载了 libcxx-21.1.8.src.tar.xz
      • 解压后发现源码包中**没有 .cppm文件
      • LLVM 的 libc++ 模块文件需要通过 CMake 构建生成模板,不是直接提供的
    2. 尝试用 -fmodules间接使用标准库:

      • 执行 clang++ -std=c++23 -stdlib=libc++ -fmodules test.cpp
      • 报错:Bionic 头文件与模块系统冲突(sigcontext sigaction重复定义)
      • 这是 Android Bionic libc 与 LLVM 模块化的兼容性问题
    3. 尝试降级为传统 #include模式: - 修改了 src/main.cpp 中的 import std; 为 #include

      • 但项目中还有 30+ 个 .cppm模块文件依赖 import std; 和 import mcpp.xxx;
      • 强制禁用模块化(-fno-modules)后,export module import关键字导致解析错误
  5. Sunrisepeak commented on Jun 22, 2026

    @Sunrisepeak
    Member

    我初步看怎么出个 aarch64 版本的mcpp 到时候贴上面 你可以试一试

  6. tz12323 commented on Jun 22, 2026

    @tz12323

    对应的源码路径在libcxx/modules/std.cppm.in,你可以试着把整个libcxx文件夹clone到本地,然后手动编译

  7. Sunrisepeak commented on Jun 22, 2026

    @Sunrisepeak
    Member

    对应的源码路径在libcxx/modules/std.cppm.in,你可以试着把整个libcxx文件夹clone到本地,然后手动编译

    出mcpp的aarch64其实容易, 但是要可用的话需要 对应工具链和mcpp一起适配 可能走 musl 这套路径短点 后面我试一下

  8. npp-zep commented on Jun 23, 2026

    @npp-zep
    Author

    问题根因似乎是 Android Bionic libc 与 LLVM C++ 模块化不兼容,而非 aarch64 Linux 通用问题。在标准 ARM64 Linux(glibc)上应该大概可以正常编译

    所以我把issue标题改了一下,这样更恰当一点

  9. changed the title [-]mcpp 在 aarch64-linux 上的编译困难问题[/-] [+]mcpp 在 Android Termux(Bionic)上的编译困难问题[/+] on Jun 23, 2026
  10. Sunrisepeak commented on Jun 23, 2026

    @Sunrisepeak
    Member

    目前你可以先安装 xlings 工具, 然后通过xlings 安装 mcpp 工具本身是可以运行的 但是编译器 目前有点问题, 你要是有兴趣可以 帮忙排查排查 (目前 mcpp 已经有 aarch64版本了)

    xlings install mcpp -y
    mcpp --version
    mcpp new hello
    cd hello && mcpp build   # 这里目前目前期望走 musl gcc 但是 系统调用的时候会出问题 目前排查中
    
  11. Sunrisepeak commented on Jun 23, 2026

    @Sunrisepeak
    Member

    android 13 好像会拦截一些系统调用导致一些问题

    • 交叉(构建 xlings/mcpp) │ 1.2.5 │ 不调 │ ✅ │
    • 原生包(Termux 上编译) │ 1.2.6 │ 启动就调 │ ❌ SIGSYS │

    musl 1.2.6 改成启动时(主线程)就注册 robust list → 调 set_robust_list → Android 13 app 沙盒 seccomp 把它 TRAP 成 SIGSYS。musl 1.2.5 不调,所以 xlings(1.2.5 链接)能跑

  12. npp-zep commented on Jun 23, 2026

    @npp-zep
    Author

    我按照建议通过 xlings 安装了 mcpp,目前进展如下:

    成功部分

    1. 通过 xlings install mcpp -y 成功安装 mcpp v0.0.59
    2. 安装了 aarch64 版本的 xlings(v0.4.58)作为引导工具
    3. 设置 MCPP_VENDORED_XLINGS 环境变量后,mcpp 可以正常启动
    4. mcpp 自动下载并安装了 patchelf、ninja 等依赖
    5. 正在自动安装 gcc@15.1.0-musl 工具链(下载中)

    当前状态

    • 工具链安装正在进行
    • 因为工具链较大,我感觉还得下一会

    待验证

    • 等工具链安装完成后,我会试试能不能正常编译

    环境信息

    • 设备:Android Termux (aarch64)
    • xlings:v0.4.58 (从 Release 下载)
    • mcpp:v0.0.59 (通过 xlings 安装)
    • 工具链:正在安装 gcc@15.1.0-musl
  13. npp-zep commented on Jun 23, 2026

    @npp-zep
    Author

    重大突破!在 Android Termux 上成功编译并运行了 mcpp 项目!

    测试环境

    • 设备:Android Termux (aarch64)
    • 引导工具:xlings v0.4.58
    • mcpp 版本:v0.0.59
    • 工具链:musl-gcc(通过 mcpp 自动下载)

    测试结果

    编译后的程序成功运行,输出:

    
    
    ~/.../87f75a86194145d1/bin $ ./test
    Hello from test!
    Built with import std + std::println on modular C++23.
    ~/.../87f75a86194145d1/bin $
    

    关键意义

    1. import std 在 Android 上成功编译 —— 通过 musl 工具链绕过了 Bionic 的限制
    2. std::println 正常工作 —— C++23 特性完整支持
    3. mcpp 的隔离工具链机制成功生效

    后续建议

    • 或许可以考虑在 README 中增加 "Android/Termux 通过 xlings 安装" 的指南
  14. npp-zep commented on Jun 23, 2026

    @npp-zep
    Author

    mcpp 在 Android Termux 上成功自举!

    验证内容

    1. 使用 xlings 安装的 mcpp v0.0.59 作为引导
    2. mcpp 自动下载了 aarch64-linux-musl 工具链(GCC 15.1.0)
    3. 用这套工具链编译了 mcpp 源码
    4. 成功生成 mcpp v0.0.60 二进制
    ~/tmp/mcpp $ mcpp build
     Downloading mcpplibs.cmdline v0.0.1
     Downloading mcpplibs:mcpplibs.cmdline@0.0.1
        Inferred sources [src/**/*.{cppm,cpp,cc,c}]
        Inferred target mcpp (bin from src/main.cpp)
       Compiling mcpp v0.0.60 (.)
       Compiling mcpplibs.cmdline v0.0.1
        Finished release [optimized] in 230.37s
    ~/tmp/mcpp $

    验证结果

    # 自编译的 mcpp 可以正常运行
    ./mcpp --version
    mcpp v0.0.60 — modern C++23 build tool
  15. Sunrisepeak commented on Jun 23, 2026

    @Sunrisepeak
    Member

    第一运行mcpp有没有卡很长时间, 我的Termux上总是网络请求卡住, 不知道是我的环境的问题还是工具的问题

    rm .mcpp -rf
    mcpp new hhh
    cd hhh
    mcpp build --verbose
    

    第一次初始化环境 大概多长时间 有没有卡的地方

  16. npp-zep commented on Jun 23, 2026

    @npp-zep
    Author

    网络环境:移动网络,直连 GitHub,未使用代理。
    我在 Termux 上首次运行 mcpp build 的实测情况:

    网络环境

    • 移动网络,直连 GitHub(未使用代理)
    • 下载 patchelf + ninja + aarch64-linux-musl-gcc(约 226 MB)

    耗时

    • 总计约 8~10 分钟完成首次初始化 + 编译 hello 项目

    工具链位置

    GCC 被放在:

    ~/.mcpp/registry/data/xpkgs/xim-x-musl-gcc/15.1.0/bin/
    
    
    ~/.../15.1.0/bin $ ls
    aarch64-linux-musl-c++         ar       gcc-nm      nm
    aarch64-linux-musl-cc          as       gcc-ranlib  objcopy
    aarch64-linux-musl-g++         c++      gcov        objdump
    aarch64-linux-musl-gcc         c++filt  gcov-dump   ranlib
    aarch64-linux-musl-gcc-15.1.0  cpp      gcov-tool   readelf
    aarch64-linux-musl-gcc-ar      elfedit  gprof       size
    aarch64-linux-musl-gcc-nm      g++      ld          strings
    aarch64-linux-musl-gcc-ranlib  gcc      ld.bfd      strip
    addr2line                      gcc-ar   lto-dump
    
    
    ~/.../15.1.0/bin $ ./gcc --version
    gcc (GCC) 15.1.0
    Copyright (C) 2025 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
    ~/.../15.1.0/bin $
  17. Sunrisepeak commented on Jun 24, 2026

    @Sunrisepeak
    Member

    Test on Termux - ok (补验证截图)

    Image
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions