【问题标题】:Compiling android .so library on visual studio error with android ndk 15c __signbit使用 android ndk 15c __signbit 在 Visual Studio 错误上编译 android .so 库
【发布时间】:2018-08-29 18:41:41
【问题描述】:

我在 Visual Studio 2017 中使用了 android ndk 13b,我得到了 android ndk 15c 的更新,其中增加了一个错误。我也在使用新的 Clang 5.0(之前是 3.8)。这是错误:

/usr/local/google/buildbot/src/android/ndk-r15-release/ndk/sources/android/support/src/stdio/vfprintf.c(242): 错误:未定义对“__signbit”的引用

这是我详细的完整回复:

1>Android clang 版本 5.0.300080(基于 LLVM 5.0.300080) 1>目标:i686-none-linux-android 1>线程模型:posix 1>安装目录: C:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r15c\toolchains\llvm\prebuilt\windows-x86_64\bin 1>找到候选GCC安装: C:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r15c\toolchains\x86-4.9\prebuilt\windows-x86_64/lib/gcc/i686-linux-android\4.9.x 1>选择的GCC安装: C:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r15c\toolchains\x86-4.9\prebuilt\windows-x86_64/lib/gcc/i686-linux-android/4.9.x 1>候选多库:.;@m32 1>选定的多库:.;@m32 1> “C:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r15c\toolchains\x86-4.9\prebuilt\windows-x86_64/lib/gcc/i686-linux-android/4.9.x/../../.. /../i686-linux-android/bin\ld" “--sysroot=C:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r15c\platforms\android-23\arch-x86” --eh-frame-hdr -m elf_i386 -shared -o "x86\Release\libPredictEngineMultiLang.so" “C:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r15c\platforms\android-23\arch-x86/usr/lib\crtbegin_so.o” “-LC:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r15c\toolchains\llvm\prebuilt\windows-x86_64\lib64\clang\5.0.300080\lib\linux\i386” “-LC:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r15c\toolchains\x86-4.9\prebuilt\windows-x86_64/lib/gcc/i686-linux-android/4.9.x” “-LC:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r15c\toolchains\x86-4.9\prebuilt\windows-x86_64/lib/gcc/i686-linux-android/4.9.x/../../. ./../i686-linux-android/lib" “-LC:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r15c\platforms\android-23\arch-x86/usr/lib” “-rpath-link=C:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r15c\platforms\android-23\arch-x86\usr\lib” “-rpath-link=C:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r15c\platforms\android-23\arch-x86\usr\lib” “-LC:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r15c\platforms\android-23\arch-x86\usr\lib” “-LC:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r15c\toolchains\x86-4.9\prebuilt\windows-x86_64\lib\gcc\i686-linux-android\4.9.x” “-LC:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r15c\sources\cxx-stl\llvm-libc++\libs\x86” “-LC:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r15c\toolchains\x86-4.9\prebuilt\windows-x86_64\lib\gcc\i686-linux-android\4.9.x” “-LC:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r15c\sources\cxx-stl\llvm-libc++\libs\x86” --no-undefined -z relro -z now -z noexecstack "x86\Release\CharsetConverter.o" "x86\Release\CppSQLite3.o" “x86\Release\PhonemConverterEN.o” "x86\Release\PhonemConverterFR.o" "x86\Release\PhoneticEngineEN.o" "x86\Release\PhoneticEngineFR.o" "x86\Release\PredictDb.o" "x86\Release\PredictEngineEN.o" "x86\Release\PredictEngineFR.o" "x86\Release\SearchEngineEN.o" "x86\Release\SearchEngineFR.o" "x86\Release\sqlite3.o" "x86\Release\DictionaryEN.o" "x86\Release\DictionaryFR.o" "x86\Release\PhonemEN.o" "x86\Release\PhonemFR.o" "x86\Release\PredictEN.o" “x86\Release\PredictFR.o” “C:\Users\hhenry-garon\Downloads\OpenSSL-for-Android-Prebuilt-master\OpenSSL-for-Android-Prebuilt-master\openssl-1.0.2\x86\lib\libcrypto.a” -landroid_support -lc++_static -lc++abi -landroid_support -lc++_static -lc++abi -llog -landroid -lgcc -ldl -lc -lgcc -ldl "C:\ProgramData\Microsoft\AndroidNDK64\android- ndk-r15c\platforms\android-23\arch-x86/usr/lib\crtend_so.o" 1>/usr/local/google/buildbot/src/android/ndk-r15-release/ndk/sources/android/support/src/stdio/vfprintf.c(242): 错误:未定义对“__signbit”的引用 1>clang.exe:错误: 链接器命令失败,退出代码为 1(使用 -v 查看调用)

我在 Visual Studio 2017 上使用 Clang 5.0 在 x86 中编译一个 android 库 .so。我只读到也许我可以添加一个 no-stdio 配置,但我不知道在 Visual Studio 2017 中在哪里做。

谢谢

【问题讨论】:

    标签: android c++ visual-studio android-ndk clang


    【解决方案1】:

    对于遇到此问题的其他人 - 我通过在 vs 的链接器标志中的“库依赖项”中添加“m”来解决此问题。似乎 libc++ 依赖于 c 数学库。 printf、sprintf 等函数使用 __signbit。

    【讨论】:

    • 为 ARM 和 x86 修复了它。对于 ARM64/x64,它不是必需的。
    【解决方案2】:

    Visual Studio 2017 上的 Android NDK 15c 存在问题。 我使用的是 LLVM 静态,我更改为 GNU 静态,现在一切正常。

    感谢微软(不是)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-01
      • 2012-10-27
      • 1970-01-01
      • 2016-07-02
      • 2019-03-15
      • 1970-01-01
      • 2014-11-28
      相关资源
      最近更新 更多