如果将-Wl,--allow-multiple-definition -Wl,--whole-archive
选项添加到CMakeLists.txt。System.loadlibrary("~");
总是会导致SIGABRT错误。
错误:A/libc: Fatal signal 6 (SIGABRT) at 0x000036ae (code=-6),thread 13998
我发现这些崩溃会在Galaxy Note 2,Galaxy s3(exynos 4 Quad 4412,ARM Cortex-A9 CPU,Android 4.4.2 Kitkat)上引发
使用Android Studio项目“ Native C ++”模板创建新项目,并在CmakeLists.txt
下方添加一行代码。
set(CMAKE_SHARED_LINKER_flaGS "-Wl,--whole-archive")
它总是在System.loadlibrary("~");
行崩溃。
基于“本地C ++”模板的代码存储库:https://github.com/kujyp/AndroidNativeWholeArchiveCrash
NDK版本:14.1.3816874
cat ~/library/Android/sdk/ndk-bundle/source.properties
> Pkg.Desc = Android NDK
> Pkg.Revision = 14.1.3816874
如果将ndk版本更改为20(20.1.5948944),则会出现另一个错误。
错误:java.lang.UnsatisfiedLinkError: dlopen failed: could not load library "libc++_shared.so" needed by "libnative-lib.so"; caused by library "libc++_shared.so" not found
已解决(但仍在星系注释2上崩溃):https://github.com/kujyp/AndroidNativeWholeArchiveCrash/commit/479c15918241e5c68621f27b22c1d56c6c9906ce
有什么线索吗?还是解决方案?
背景:
https://gist.github.com/kujyp/9c4c8c63cfd12f797639874d151b1707#file-with_tf1-4_cmakelists-txt
我的项目具有tensorflow-core.a(v1.4.0)作为依赖项。因此,在没有--allow-multiple-definition
或--whole-archive
的情况下,tensorflow库会引发一些构建错误。所以我的编译器选项,链接器选项与tensorflow存储库中的相同。
选项:https://github.com/tensorflow/tensorflow/blob/v1.4.0/tensorflow/contrib/android/cmake/CMakeLists.txt#L45-L48
关于--whole-archive
选项的问题:https://github.com/tensorflow/tensorflow/issues/4242
对于tensorflow库,应该使用gcc而不是clang作为构建工具。从ndk 15起,不建议使用gcc。
(从tf1.13.1起,clang被用作构建工具,但我的项目使用的是tensorflow 1.4.0或1.5.1或1.12.0)
张量流的Ndk版本:https://github.com/tensorflow/tensorflow/blob/v1.4.0/tensorflow/tools/ci_build/Dockerfile.android#L44