Использование std :: bad_function_call с LIBCPP_ABI_UNSTABLE - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь создать собственную библиотеку в своем проекте Android Studio, которая использует функцию std::bad_function_call.

Вот файл CMakeLists.txt, который я использую для создания собственного модуля:

cmake_minimum_required(VERSION 3.4.1)

include_directories(src/main/cpp)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -D_LIBCPP_ABI_UNSTABLE")

add_library(
    MyLib
    SHARED
    src/main/cpp/test.cpp
)

и my test.cpp содержит следующий код:

void SomeClass::SomeMethod() {
    std::function<int()> f = nullptr;
    try {
        f();
    } catch (const std::bad_function_call& e) {
    }
}

с соответствующим разделом build.gradle:

externalNativeBuild {
    cmake {
        arguments "-DANDROID_TOOLCHAIN=clang", "-DANDROID_STL=c++_static", "-DANDROID_NDK_ROOT=${android.ndkDirectory}"
    }
}

Если я передам _LIBCPP_ABI_UNSTABLE флаг для компилятора Я получаю ошибку ссылки:

Execution failed for task ':runtime:externalNativeBuildRelease'.
> Build command failed.
  Error while executing process C:\android-sdk\cmake\3.6.4111459\bin\cmake.exe with arguments {--build C:\work\android-runtime\test-app\runtime\.externalNativeBuild\cmake\release\armeabi-v7a --target MyLib}
  [1/1] Linking CXX shared library ..\..\..\..\build\intermediates\cmake\release\obj\armeabi-v7a\libMyLib.so
  FAILED: cmd.exe /C "cd . && C:\android-sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe  --target=armv7-none-linux-androideabi17 --gcc-toolchain=C:/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64 -fPIC --sysroot C:/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mfpu=vfpv3-d16 -fno-addrsig -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -stdlib=libc++  -fno-rtti -D_LIBCPP_ABI_UNSTABLE -Oz -DNDEBUG  -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--exclude-libs,libunwind.a -Wl,--no-undefined -Qunused-arguments -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libMyLib.so -o ..\..\..\..\build\intermediates\cmake\release\obj\armeabi-v7a\libMyLib.so CMakeFiles/MyLib.dir/src/main/cpp/test.cpp.o  ../../../../src/main/libs/armeabi-v7a/abc.a -llog -latomic -lm && cd ."
  C:/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/c++/v1/functional:0: error: undefined reference to 'vtable for std::__ndk1::bad_function_call'

  C:/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin\ld: the vtable symbol may be undefined because the class is missing its key function

  C:/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/c++/v1/functional:0: error: undefined reference to 'std::__ndk1::bad_function_call::~bad_function_call()'

  clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)

  ninja: build stopped: subcommand failed.

Если я уберу флаг _LIBCPP_ABI_UNSTABLE:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti")

, тогда проект компилируется нормально.

Таким образом, мой вопрос заключается в том, как правильно включить libc++ unstable abi и использовать метод bad_function_call внутри моего собственного модуля?

Примечание. Я использую Android NDK 19.

...