You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android编译报错:找不到libm.so.6库——Dlang Vulkan应用交叉编译问题

解决Dlang交叉编译Android库时libm.so.6 not found错误

问题原因

你的libmain.so依赖了Ubuntu主机系统的libm.so.6,但Android系统的数学库是无版本号的libm.so,两者不兼容。本质是交叉编译时LDC没有正确使用Android NDK的标准库,反而链接了主机的库文件。

解决方案

1. 强制LDC使用NDK交叉工具链

编译时显式指定目标平台、sysroot和交叉编译器,确保完全脱离主机工具链:

ldc2 -shared \
  -of=libmain.so \
  -target=x86_64-linux-android31 \
  --sysroot=/path/to/ndk/27.0.11718104/toolchains/llvm/prebuilt/linux-x86_64/sysroot \
  --cc=x86_64-linux-android31-clang \
  --ld=x86_64-linux-android31-clang \
  -L-lm \
  -L--no-undefined \
  main.d
  • 替换/path/to/ndk为你的NDK实际安装路径
  • -L--no-undefined会在编译阶段检测未定义符号,提前避免依赖主机库的问题

2. 修正ldc2.conf配置

编辑LDC的配置文件(通常在/etc/ldc2.conf或~/.ldc2.conf),添加Android目标平台的专属配置块:

[target.x86_64-linux-android31]
sysroot = "/path/to/ndk/27.0.11718104/toolchains/llvm/prebuilt/linux-x86_64/sysroot"
cc = "x86_64-linux-android31-clang"
ld = "x86_64-linux-android31-clang"
lib-dirs += [
    "/path/to/ndk/27.0.11718104/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/31",
    "/path/to/ndk/27.0.11718104/toolchains/llvm/prebuilt/linux-x86_64/lib64/clang/17/lib/linux/x86_64"
]
  • 确保lib-dirs包含NDK对应架构和API版本的库目录
  • 配置后重新编译,LDC会自动使用NDK的库文件

3. 正确验证库依赖

不要用主机的ldd(它会解析主机系统的库),改用NDK自带的readelf检查依赖:

/path/to/ndk/27.0.11718104/toolchains/llvm/prebuilt/linux-x86_64/bin/x86_64-linux-android-readelf -d libmain.so | grep NEEDED

输出应该包含libm.so而非libm.so.6,说明依赖已正确指向Android标准库。

4. 检查Android Studio项目配置

  • 确保jniLibs/x86_64目录下的libmain.so是重新编译后的正确版本
  • 在模块的build.gradle中指定匹配的ABI:
android {
    defaultConfig {
        ndk {
            abiFilters 'x86_64'
        }
    }
}

内容的提问来源于stack exchange,提问作者infinityplusb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 18:13:28