2017-06-24 19 views
0

Androidスタジオ内にC++ NDKライブラリを構築しようとしています。jsonと呼ばれる外部ライブラリと、localeconvで失敗したClangコンパイラがあります。NDK Clangのエラー: '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] Linking CXX shared library ........\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,--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:\XXXXX\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) ninja: build stopped: subcommand failed. :app:externalNativeBuildDebug FAILED

ターゲットSDKは21.Minimum SDKは19.NDKバージョンです:15.0.4075724

同じコードベースは、Visualに罰金コンパイルされています同じツールチェーンを使用するStudio Androidプロジェクト。

答えて

2

答えは - SDK 19のNDKバージョンは、STLでC++ 11標準全体を実装していません。 locale.hヘッダはlocaleconv()メソッドのスタブを持っていますが、ライブラリがlocaleconv()はSDK 21.Thisが暗黙のうちに、ヘッダに記載されている実装it.The最も近いのAndroid SDKを実装していない<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_ */ 
関連する問題