[英]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.