【问题标题】:How remove libgnustl_static.a at linking when compiling apk with native code using Android Studio?使用 Android Studio 使用本机代码编译 apk 时,如何在链接时删除 libgnustl_static.a?
【发布时间】:2019-06-10 14:46:58
【问题描述】:

我正在使用 Android Studio (3.4.1) 构建一个包含 C++ 部分的 apk。编译阶段有效,链接阶段抛出错误。

错误:

clang++:错误:没有这样的文件或目录: '/Users/homefolder/Library/Android/sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/libs/x86/libgnustl_static.a'

这来自完整链接命令的最后一行:

/Users/homefolder/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=i686-none-linux-android23 --gcc-toolchain=/Users/homefolder/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64 --sysroot=/Users/homefolder/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -fno-addrsig -Wa,--noexecstack -Wformat -Werror=format-security -O2 -DNDEBUG -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -Wl,-z,noexecstack -shared -Wl,-soname,libmy_lib.so -o ../../../. ./build/intermediates/cmake/release/obj/x86/libmy_lib.so CMakeFiles/my_lib.dir/src/main/cpp/my_lib.cpp.o -llog ../../../../libs/x86/libssl.a ../../../../libs/x86/libcrypto.a -latomic -lm "/Users /homefolder/Library/Android/sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/libs/x86/libgnustl_static.a"

这个库确实不在我的 sdk 文件夹中。文件夹 gnu-lib-stdc++ 不存在。

据我了解,本机代码是用 CMake 编译的。 CMake 生成 build.ninja 文件并执行 ninja 进行编译。如果我手动修改这些生成的 build.ninja 文件删除这个库,然后在终端中调用ninja(在正确的文件夹中),那么它可以完美地编译和链接。

问题:

我应该在哪里修改 Android Studio 设置以使这些 build.ninja 文件不再包含此库?我不想每次生成 apk 时都修改生成的文件。

到目前为止我所做的尝试:

我找到的唯一与 CMake 相关的参数文件是 CMakeList.txt。从文档 (1) 看来,这个库似乎可以使用 CMAKE_ANDROID_STL_TYPE 设置。我已经把它放到了CMakeList.txt 中的'none''system',但我发现build.ninja 文件没有区别。

# CMakeList.txt
set(CMAKE_ANDROID_STL_TYPE none)

配置:

  • Android Studio 3.4.1
  • Android SDK 工具 26.1.1
  • CMake 3.10.2(不确定, 3.6 也安装了)
  • macOS 10.14

【问题讨论】:

  • 标题“如何删除默认数学库...”并不能反映问题:问题完全与libgnustl_static.a库有关。不知道为什么您在链接命令中突出显示-lm。您使用的变量 的正确名称是CMAKE_ANDROID_STL_TYPEANDROID_STL_TYPE 是一个property 名称,set() 对其不起作用。还要确保,您set() 变量之前 add_library 调用CMakeLists.txt
  • @Tsyvarev “-lm”是否意味着与数学库链接,以下路径是该库的链接?据我了解,这是我要删除的整个选项。不是吗?
  • 不,-lm 是一个与数学库链接的单独选项。双引号中的最后一个参数也是一个 separate 选项,它也意味着链接。最后两个选项之间的区别在于-l 标志要求链接器搜索 库。如果没有-l,链接器只会使用传递的路径。
  • 好的,我明白了,谢谢。我将修改主题。然而,在调用add_library 之前,我为set() 尝试了许多值,而build.file 根本没有改变。就像我的set() 没有效果一样。
  • 你也安装了NDK,在SDK Manager中检查。问题,很可能来自Android级插件版本,类似于this案例。

标签: android c++ cmake android-ndk ninja


【解决方案1】:

从文档 (1) 看来,这个库似乎可以使用 CMAKE_ANDROID_STL_TYPE 设置。我已在 CMakeList.txt 中将其设置为“无”或“系统”,但我发现 build.ninja 文件没有任何区别。

# CMakeList.txt
set(CMAKE_ANDROID_STL_TYPE none)

错误的文档。你想要https://developer.android.com/ndk/guides/cmake。在 build.gradle 中设置以下值:

android {
  defaultConfig {
    externalNativeBuild {
      cmake {
        arguments "-DANDROID_STL=none",
      }
    }
  }
}

【讨论】:

    【解决方案2】:

    感谢 Tsyvarev cmets 的进一步研究,我找到了解决方案:我手动修改了 .ExternalNativeBuild 文件夹中的所有 CMakeCache.txt 文件。

    之前:

    CMAKE_CXX_STANDARD_LIBRARIES:STRING=-latomic -lm "/Users/homefolder/Library/Android/sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/libgnustl_static.a"
    

    手动修复:

    CMAKE_CXX_STANDARD_LIBRARIES:STRING=-latomic -lm
    

    然后,自动生成的 build.ninja 文件不再包含指向 libgnustl_static.a 的链接。然后 apk 编译。

    此修复不会发送给我。我虽然.ExternalNativeBuild 中的所有文件都是在每个新版本中自动生成和删除的。该名称本身包含cache,因此听起来不像是用户应该修改的文件。然而,它是我的问题的有效解决方案。

    我相信是这些CCMakeCaches.txt 文件在第一次构建时生成,然后重新用于以下构建请求。这对我来说非常不合逻辑。我不明白为什么set(CMAKE_ANDROID_STL_TYPE none) 不起作用。

    【讨论】:

      猜你喜欢
      • 2017-08-07
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-26
      • 2014-10-25
      • 1970-01-01
      相关资源
      最近更新 更多