【问题标题】:NDK Clang error: undefined reference to 'localeconv'NDK Clang 错误:未定义对“localeconv”的引用
【发布时间】:2017-11-27 21:38:16
【问题描述】:

我正在尝试在 Android Studio 中构建 C++ NDK 库。我有一个名为 json 的外部库,并且 Clang 编译器在 localeconv 上失败。

json.hpp:11867:错误:未定义对“localeconv”的引用

locale.h 标头存在并位于 ndk 目录 sysroot/usr/include 中。

我的工具链如下所示:

Gradle:(仅显示与 NDK 相关的部分)

 externalNativeBuild {
        cmake {

            arguments "-DANDROID_PLATFORM_LEVEL=${platformVersion}",
                    '-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=gnustl_static'
        }

        ndk {
            abiFilters 'armeabi-v7a'

        }
    }

Cmake

 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11 -Wall")
 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -frtti  -fexceptions  -Wall")

  //'native-lib' is the final .so that's packaged into apk
       target_link_libraries(native-lib
                   OPENAL
                   FREETYPE
                   android
                    EGL
                    ${OPENGL_LIB}
                    log
                    m
                    z
                    atomic
                    gnustl_static
                    ) 

这里是链接器命令行:

[1/1] 链接 CXX 共享库 ........\build\intermediates\cmake\debug\obj\armeabi-v7a\libnative-lib.so 失败:cmd.exe /C "cd . && D:\Android\android-sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=armv7-none-linux-androideabi --gcc-toolchain=D:/Android/android-sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64 --sysroot=D:/Android/android-sdk/ndk-bundle/sysroot -fPIC -isystem D:/Android/android-sdk/ndk-bundle/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=19 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -fno-integrated -as -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11 -frtti -fexceptions -Wall -O0 -fno-limit-debug-info -Wl,--exclude-libs, libgcc.a --sysroot D:/Android/android-sdk/ndk-bundle/platforms/android-19/arch-arm -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,-z, noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libnative-lib.so

完全错误:

“D:/Android/android-sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/libgnustl_static.a” && cd ." D:\XXXXXX\XXXXXX\windows....\thirdparty\json/json.hpp:11867: error: undefined reference to 'localeconv' clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation) 忍者:构建停止:子命令失败。 :app:externalNativeBuildDebug 失败

目标 SDK 为 21。最低 SDK 为 19.NDK 版本:15.0.4075724

相同的代码库在使用相同工具链的 Visual Studio Android 项目中编译良好。

【问题讨论】:

    标签: android c++ android-ndk


    【解决方案1】:

    答案是 - SDK 19 的 NDK 版本没有在 STL 中实现整个 C++11 标准。 locale.h 标头具有 localeconv() 方法的存根,但该库没有实现它。实现 localeconv() 的最接近的 Android SDK 是 SDK 21。这在标头 <locale.h> 中隐含说明

    struct lconv* localeconv(void) __INTRODUCED_IN(21) __VERSIONER_NO_GUARD;
    
    #if __ANDROID_API__ >= 21
    locale_t duplocale(locale_t) __INTRODUCED_IN(21);
    void freelocale(locale_t) __INTRODUCED_IN(21);
    locale_t newlocale(int, const char*, locale_t) __INTRODUCED_IN(21);
    #endif /* __ANDROID_API__ >= 21 */
    
    char* setlocale(int, const char*);
    
    #if __ANDROID_API__ >= 21
    locale_t uselocale(locale_t) __INTRODUCED_IN(21);
    #endif /* __ANDROID_API__ >= 21 */
    
    
    #define LC_GLOBAL_LOCALE __BIONIC_CAST(reinterpret_cast, locale_t, -1L)
    
    __END_DECLS
    
    #endif /* _LOCALE_H_ */
    

    【讨论】:

    • 我在使用 locale.h 的 Lua-5.3.4 库中遇到了同样的问题。我无法理解这里的解决方案,请您解释一下。是否建议在APP build.gradle 中将android minSDKVersion 增加到21?
    • SDK 19 不包含该功能。使用较新的 SDK
    • 如何通过更改最低sdk版本来使用较新的SDK?
    • @madanV 没错。安装和使用更高版本的 SDK
    【解决方案2】:

    对于我来说,尝试使用 Lua 5.4.0,我必须将 API 级别定义为 21

    Cmake 文件为:

    set(ANDROID_NATIVE_API_LEVEL    21)
    

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题,不幸的是,更改 API 级别对我不起作用——我正在使用运行 API16 的旧平板电脑。您可以尝试Crystax NDK,也可以编写一个模仿localeconv() 的丑陋函数。后者解决了我的问题,因为我正在构建 Lua for Android Terminal Emulator 的爱好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-02
        • 2017-05-02
        • 2017-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多