NDK Clang错误:未定义引用' localeconv'

时间:2017-06-24 11:56:24

标签: android c++ android-ndk

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

  

json.hpp:11867:错误:未定义引用' localeconv'

locale.h标头存在并位于ndk dir 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共享库   ........ \构建\中间体\ cmake的\调试\ OBJ \ armeabi-V7A \ libnative-lib.so   失败:cmd.exe / C" cd。 &安培;&安培;   d:\ Android的\ Android的SDK \ NDK束\工具链\ LLVM \预置的\ WINDOWS-x86_64的\ BIN \铛++ 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束/源/ CXX-STL / GNU-的libstdc ++ / 4.9 /库/ armeabi-V7A / libgnustl_static.a"   &安培;&安培; cd。" d:\ XXXXX \ XXXXXX \ WINDOWS .... \第三方\ JSON / json.hpp:11867:   错误:未定义引用' localeconv' clang ++。exe:错误:链接器命令失败,退出代码为1(使用-v查看调用)   忍者:构建停止:子命令失败。 :应用:externalNativeBuildDebug   FAILED

目标SDK是21.Minimum SDK是19.NDK版本:15.0.4075724

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

3 个答案:

答案 0 :(得分:6)

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

<locale.h>

答案 1 :(得分:0)

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

Cmake文件为:

set(ANDROID_NATIVE_API_LEVEL    21)

答案 2 :(得分:0)

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