错误 未定义对 'std::__ndk1::locale::~locale()' 的引用。

5

我在使用Android Studio ndk编译代码时,使用Boost for Android遇到了问题。我正在使用来自boost的库之一libboost_filesystem-clang-mt-a32-1_66.a,但是它显示以下错误:

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:externalNativeBuildDebug'.
> Build command failed.
  Error while executing process /home/user/Android/Sdk/cmake/3.6.4111459/bin/cmake with arguments {--build /home/user/git/project/app/.externalNativeBuild/cmake/debug/armeabi-v7a --target native-lib}
  [1/2] Building CXX object CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o
  [2/2] Linking CXX shared library ../../../../build/intermediates/cmake/debug/obj/armeabi-v7a/libnative-lib.so
  FAILED: : && /home/user/Downloads/android-ndk-r16b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++  --sysroot=/home/user/Downloads/android-ndk-r16b/sysroot -fPIC -isystem /home/user/Downloads/android-ndk-r16b/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=23 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -mfpu=neon -Wa,--noexecstack -Wformat -Werror=format-security  -std=c++11 -Wno-error=format-security -fpermissive -fopenmp -Og -fopenmp -O0  -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a --sysroot /home/user/Downloads/android-ndk-r16b/platforms/android-23/arch-arm -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libnative-lib.so -o ../../../../build/intermediates/cmake/debug/obj/armeabi-v7a/libnative-lib.so CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o -L/home/user/git/project/app/src/main/cpp/libs -laltumfacerecognizesdk_android -laltumfacedetectsdk_android ../../../../src/main/jniLibs/armeabi-v7a/libopencv_java.so /home/user/git/project/OpenCV-android-sdk/sdk/native/libs/armeabi-v7a/libopencv_core.a /home/user/git/project/OpenCV-android-sdk/sdk/native/libs/armeabi-v7a/libopencv_highgui.a /home/user/git/project/OpenCV-android-sdk/sdk/native/libs/armeabi-v7a/libopencv_imgproc.a /home/user/git/project/OpenCV-android-sdk/sdk/native/libs/armeabi-v7a/libopencv_video.a /home/user/Downloads/android-ndk-r16b/platforms/android-23/arch-arm/usr/lib/liblog.so ../../../../src/main/cpp/libs/libgnustl_shared.so -lncnn -lboost_filesystem-clang-mt-a32-1_66 -lboost_system-clang-mt-a32-1_66 /home/user/git/project/OpenCV-android-sdk/sdk/native/libs/armeabi-v7a/libopencv_androidcamera.a /home/user/git/project/OpenCV-android-sdk/sdk/native/3rdparty/libs/armeabi-v7a/liblibjpeg.a /home/user/git/project/OpenCV-android-sdk/sdk/native/3rdparty/libs/armeabi-v7a/liblibpng.a /home/user/git/project/OpenCV-android-sdk/sdk/native/3rdparty/libs/armeabi-v7a/liblibtiff.a /home/user/git/project/OpenCV-android-sdk/sdk/native/3rdparty/libs/armeabi-v7a/liblibjasper.a /home/user/git/project/OpenCV-android-sdk/sdk/native/3rdparty/libs/armeabi-v7a/libIlmImf.a /home/user/git/project/OpenCV-android-sdk/sdk/native/libs/armeabi-v7a/libopencv_imgproc.a /home/user/git/project/OpenCV-android-sdk/sdk/native/libs/armeabi-v7a/libopencv_core.a -lz -ldl -lm -llog -ldl -lm -llog -latomic -lm "/home/user/Downloads/android-ndk-r16b/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/libsupc++.a" "/home/user/Downloads/android-ndk-r16b/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/libgnustl_shared.so" && :
  ./boost/system/system_error.hpp:31: error: undefined reference to 'std::runtime_error::runtime_error(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&)'
  ./boost/system/system_error.hpp:31: error: undefined reference to 'std::runtime_error::runtime_error(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&)'
  /home/user/Downloads/android-ndk-r16b/sources/cxx-stl/llvm-libc++/include/stdexcept:136: error: undefined reference to 'std::logic_error::logic_error(char const*)'
  ./boost/system/system_error.hpp:31: error: undefined reference to 'std::runtime_error::runtime_error(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&)'
  libs/filesystem/src/path.cpp:897: error: undefined reference to 'std::__ndk1::locale::locale(char const*)'
  /home/user/Downloads/android-ndk-r16b/sources/cxx-stl/llvm-libc++/include/__locale:212: error: undefined reference to 'std::__ndk1::locale::use_facet(std::__ndk1::locale::id&) const'
  libs/filesystem/src/path.cpp:914: error: undefined reference to 'std::__ndk1::locale::~locale()'
  libs/filesystem/src/path.cpp:914: error: undefined reference to 'std::__ndk1::codecvt<wchar_t, char, mbstate_t>::id'
  libs/filesystem/src/path.cpp:897: error: undefined reference to 'std::__ndk1::locale::locale(char const*)'
  libs/filesystem/src/path.cpp:947: error: undefined reference to 'std::__ndk1::locale::locale(std::__ndk1::locale const&)'
  libs/filesystem/src/path.cpp:897: error: undefined reference to 'std::__ndk1::locale::locale(char const*)'
  libs/filesystem/src/path.cpp:948: error: undefined reference to 'std::__ndk1::locale::operator=(std::__ndk1::locale const&)'
  libs/filesystem/src/path.cpp:950: error: undefined reference to 'std::__ndk1::locale::~locale()'
  libs/filesystem/src/path.cpp:914: error: undefined reference to 'std::__ndk1::locale::~locale()'
  libs/filesystem/src/path.cpp:914: error: undefined reference to 'std::__ndk1::locale::~locale()'
  /home/user/Downloads/android-ndk-r16b/sources/cxx-stl/llvm-libc++/include/stdexcept:146: error: undefined reference to 'std::logic_error::logic_error(char const*)'
  collect2: error: ld returned 1 exit status
  ninja: build stopped: subcommand failed.


* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

* Get more help at https://help.gradle.org

BUILD FAILED in 2s

我曾尝试使用 -DANDROID_STL=gnu_shared 或 -DANDROID_STL=gnu_static,但结果相同。我花了一天时间,仍无法使其能够编译。在 CMakeList 中:
add_library(lib_opencv SHARED IMPORTED)
add_library(lib_gnustl_shared SHARED IMPORTED)

set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION ${pathToProject}/app/src/main/jniLibs/${ANDROID_ABI}/libopencv_java.so)
set_target_properties(lib_gnustl_shared PROPERTIES IMPORTED_LOCATION ${pathToProject}/app/src/main/cpp/libs/libgnustl_shared.so)
target_link_libraries( # Specifies the target library.
                   native-lib
                   lib_opencv
                   # Links the target library to the log library
                   # included in the NDK.
                   ${OpenCV_LIBS}
                   ${log-lib}
                   boost_filesystem-clang-mt-a32-1_66
                   boost_system-clang-mt-a32-1_66
                   lib_gnustl_shared
                    )

在Gradle中:

        externalNativeBuild {
        cmake {
            arguments "-DANDROID_TOOLCHAIN=gcc","-DANDROID_ARM_NEON=TRUE" ,"-DANDROID_STL_FORCE_FEATURES=OFF", "-DANDROID_STL=gnustl_shared"
            cppFlags "-std=c++11", "-Wno-error=format-security", "-fpermissive", "-fopenmp", "-Og"
        }

我曾尝试使用-DANDROID_STL=gnu_shared,我猜你的意思是gnustl_shared而不是gnu_shared(?). 无论如何,从NDK r16开始,gnustl已被弃用,你应该切换到libc++. - Michael
当我使用c++_shared进行编译时,它无法找到vector头文件。无法#include <vector>,这导致了“没有这样的文件”错误。 - holopekochan
3个回答

7

您的Boost库是使用libc++构建的(可以通过其引用std::__ndk1::*而不仅仅是std::*来判断)。 您需要使用libc++而不是gnustl。


有没有办法同时使用c++_shared和gnustl_shared?因为切换到c++_shared后,我又出现了另一个错误信息:error: undefined reference to Draw::GetRectangles(cv::Mat const&, std::__ndk1::vector<Box, std::__ndk1::allocator<Box> >&) - holopekochan
不行,你的应用程序必须只使用一个STL。第二个错误看起来像是另一个问题,你应该为它提出一个新的问题。 - Dan Albert
使用arguments "-DANDROID_STL=c++_shared",gnustl现在已经过时了。 - Amarghosh

1

你可能会错过或忘记Application.mk文件,就像我一样不小心删除了它,然后就出现了这个编译错误:

/home/lingyunxiao/dev/GifskiAndroid/gifski/build/intermediates/ndkBuild/debug/obj/local/arm64-v8a/objs-debug/gifskiad//home/lingyunxiao/dev/GifskiAndroid/gifski/src/main/cpp/gifski/GifskiJniApi.o: In function `Java_com_lingyunxiao_gifski_GifskiJniApi_gifskiNew':
/home/lingyunxiao/dev/GifskiAndroid/gifski/src/main/cpp/gifski/GifskiJniApi.cpp:45: undefined reference to `std::__ndk1::to_string(int)'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [/home/lingyunxiao/dev/android-sdk/ndk/21.1.6352462/build/core/build-binary.mk:725: /home/lingyunxiao/dev/GifskiAndroid/gifski/build/intermediates/ndkBuild/debug/obj/local/arm64-v8a/libgifskiad.so] Error 1

我回滚了那个文件,错误消失了,这是 mk 文件的内容:

APP_STL := c++_static

0

我曾经遇到过类似的问题,但只是更改了源代码,而没有更改工具链。

后来我开始收到以下错误信息:

/home/myuser/Android/Sdk/ndk/22.0.7026061/sources/cxx-stl/llvm-libc++/include/__locale:887:44: error: implicit instantiation of undefined template 'std::__ndk1::ctype<char *>'
    return use_facet<ctype<_CharT> >(__loc).tolower(__c);
                                           ^

只有在 Android 上编译时才会出现问题,而在 Linux 和 Windows 上编译代码都很好。

事实证明,当我试图使我的代码更具可移植性和标准化时,我已经替换了:

char desc[100];
..
if (strcasecmp(desc,"recorddeleted") == 0)

使用

char desc[100];
std::locale loc;
..
if (strncmp(std::tolower(desc,loc), "sometext", 13) == 0)

在安卓上失败了。FYI我正在使用APP_STL := c++_shared


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接