Visual Studio编译Android .so库遇NDK 15c __signbit未定义引用错误求助
解决NDK 15c + Clang 5.0编译Android .so时
__signbit未定义的错误 我来帮你搞定这个升级NDK后碰到的链接错误,这算是版本切换时很常见的依赖配置问题。先给你直接的解决方案,再聊背后的原因:
具体解决步骤
- 添加libm库链接:
__signbit是标准数学库(libm)里的函数,NDK r15开始不再默认自动链接这个库,得手动加上。在Visual Studio 2017里操作的话:- 打开你的Android项目属性面板
- 转到
Linker -> Input -> Additional Dependencies - 添加
m就行(因为Android的库命名规则是libxxx.so,所以只需要写xxx部分)
如果是用Makefile编译,记得在LDFLAGS里加上-lm。
- 确认目标API级别:NDK r15对最低支持的API级别有要求,确保你项目里的
APP_PLATFORM(或者VS中Android NDK -> Platform选项)不低于Android 4.1(API级别16),低版本的系统库可能没正确导出__signbit符号。 - 排查优化级别影响:要是你开了过高的编译优化(比如
-O3),可能会让编译器的符号解析出问题,可以临时把优化级别降到-O2试试,确认是不是优化导致的异常。
错误原因分析
你之前用的NDK 13b搭配Clang 3.8,旧版本的NDK支持库(android/support/src/stdio/vfprintf.c)要么对__signbit有本地实现,要么默认自动链接了libm;但升级到NDK 15c和Clang 5.0后,NDK的支持库改了实现逻辑,直接依赖系统libm里的__signbit函数,而你的编译配置没显式链接libm,所以就出现了未定义引用的错误。
你提供的错误及编译环境信息
/usr/local/google/buildbot/src/android/ndk-r15-release/ndk/sources/android/support/src/stdio/vfprintf.c(242): error : undefined reference to '__signbit'
1>Android clang version 5.0.300080 (based on LLVM 5.0.300080)
1>Target: i686-none-linux-android
1>Thread model: posix
内容的提问来源于stack exchange,提问作者hugo411
相关产品推荐
相关产品推荐

