首页 文章

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

提问于
浏览
3

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

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
                    )

And here is the linker command line:

[1/1]链接CXX共享库........ \ build \ intermediates \ cmake \ debug \ obj \ armeabi-v7a \ libnative-lib.so FAILED: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, - 致命警告-Wl, - fi x-cortex-a8 -Wl, - no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libnative-lib . 所以

The complete error:

“D:/ Android / android-sdk / ndk-bundle / sources / cxx-stl / gnu-libstdc /4.9/libs/armeabi-v7a/libgnustl_static.a”&& cd . “D:\ XXXXX \ XXXXXX \ windows . ... \ thirdparty \ json / json.hpp:11867:错误:未定义引用'localeconv'clang .exe:错误:链接器命令失败,退出代码为1(使用-v查看调用)ninja:build stopped:子命令失败 . :app:externalNativeBuildDebug FAILED

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

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

1 回答

  • 5

    答案是 - SDK 19的NDK版本没有在STL中实现整个C 11标准 . locale.h 标头有 localeconv() 方法的存根,但是库没有实现它 . 实现 localeconv() 的最接近的Android SDK是SDK 21.这在 Headers <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_ */
    

相关问题