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
相关产品推荐
相关产品推荐

