簡體   English   中英

NDK Clang 錯誤:未定義對“localeconv”的引用

[英]NDK Clang error: undefined reference to 'localeconv'

我正在嘗試在 Android Studio 中構建 C++ NDK 庫。我有一個名為json的外部庫,Clang 編譯器在 localeconv 上失敗。

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'

        }
    }

制作

 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 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:錯誤:未定義對“localeconv” clang++.exe 的引用:錯誤:鏈接器命令失敗,退出代碼為 1(使用 -v 查看調用) ninja:構建停止:子命令失敗。 :app:externalNativeBuildDebug 失敗

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

相同的代碼庫在使用相同工具鏈的 Visual Studio Android 項目中編譯得很好。

答案是 - 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_ */

對我來說,嘗試使用 Lua 5.4.0,我必須將 API 級別定義為 21

Cmake文件為:

set(ANDROID_NATIVE_API_LEVEL    21)

我遇到了類似的問題,不幸的是,更改 API 級別對我不起作用——我正在使用運行 API16 的舊平板電腦。 您可以嘗試Crystax NDK,或者您可以編寫一個模仿localeconv()的丑陋函數。 后者解決了我的問題,因為我正在為業余愛好為 Android 終端模擬器構建 Lua。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM