在使用Android Studio使用本机代码编译apk时,如何删除libgnustl_static.a at链接? 我使用Android Studio(3.4.1)来构建包含C++部分的APK。编译阶段工作,链接阶段抛出错误

在使用Android Studio使用本机代码编译apk时,如何删除libgnustl_static.a at链接? 我使用Android Studio(3.4.1)来构建包含C++部分的APK。编译阶段工作,链接阶段抛出错误,android,c++,cmake,android-ndk,ninja,Android,C++,Cmake,Android Ndk,Ninja,错误: 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/toolschains/llvm/prebuild/darwin-x86_64/bin/c

错误:

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/toolschains/llvm/prebuild/darwin-x86_64/bin/clang++ --target=i686-none-linux-android23--gcc工具链=/Users/homefolder/Library/Android/sdk/ndk bundle/toolschains/llvm/prebuild/darwin-x86_64 --sysroot=/Users/homefolder/Library/Android/sdk/ndk bundle/toolschains/llvm/prebuild/darwin-x86_64/sysroot -fPIC-g-DANDROID-fdata sections-fffunction sections-funwind tables-fstack protector strong-无规范前缀-mstackrealling-fno addrsig-Wa,--noexecstack-Wformat-Werror=格式安全性-O2-DNDEBUG-Wl,-排除libgcc.a-Wl,-排除libs,libatomic.a-静态libstdc++-Wl,--build id-Wl,--警告共享textre-Wl,--致命警告-Wl,-无未定义-使用的参数-Wl,-z,noexecstack-shared-Wl,-soname,libmy_lib.so-o../../../../../../build/mediates/cmake/release/obj/x86/libmy_lib.so cmakfiles/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\u static.a

实际上,我的sdk文件夹中不存在此库。文件夹
gnu lib stdc++
不存在

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

问题:

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

到目前为止我所尝试的:

我找到的唯一与CMake相关的参数文件是
CMakeList.txt
。从文档()来看,似乎可以使用
CMAKE\u ANDROID\u STL\u TYPE
设置此库。我已经在
CMakeList.txt
中将其设置为
'none'
'system'
,但是我在build.ninja文件中没有看到任何差异

# CMakeList.txt
set(CMAKE_ANDROID_STL_TYPE none)
# 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

通过Tsyvarev的评论进一步研究后,我找到了解决方案:我手动修改了
.ExternalNativeBuild
文件夹中的所有
cmakcache.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
中的所有文件都是自动生成的,并在每次新生成时删除。名称本身有
缓存
,因此听起来不像是用户应该修改的文件。然而,这是解决我问题的有效办法


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

通过Tsyvarev的评论进一步研究后,我找到了解决方案:我手动修改了
.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
中的所有文件都是自动生成的,并在每次新生成时删除。名称本身有
缓存
,因此听起来不像是用户应该修改的文件。然而,这是解决我问题的有效办法

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

从文档(1)来看,似乎可以使用CMAKE_ANDROID_STL_类型设置此库。我在CMakeList.txt中将其设置为“无”或“系统”,但在build.ninja文件中没有发现任何差异

# CMakeList.txt
set(CMAKE_ANDROID_STL_TYPE none)
# CMakeList.txt
set(CMAKE_ANDROID_STL_TYPE none)
错误的文档。你想要的。在build.gradle中设置以下值:

android {
  defaultConfig {
    externalNativeBuild {
      cmake {
        arguments "-DANDROID_STL=none",
      }
    }
  }
}
从文档(1)来看,似乎可以使用CMAKE_ANDROID_STL_类型设置此库。我在CMakeList.txt中将其设置为“无”或“系统”,但在build.ninja文件中没有发现任何差异

# CMakeList.txt
set(CMAKE_ANDROID_STL_TYPE none)
# CMakeList.txt
set(CMAKE_ANDROID_STL_TYPE none)
错误的文档。你想要的。在build.gradle中设置以下值:

android {
  defaultConfig {
    externalNativeBuild {
      cmake {
        arguments "-DANDROID_STL=none",
      }
    }
  }
}
标题“如何删除默认数学库…”并没有反映问题:问题完全是关于
libgnustl\u static.a
库。不确定为什么在link命令中高亮显示
-lm
。您使用的变量的正确名称是,
ANDROID\u STL\u TYPE
是一个属性名,对于它,
set()
不起作用。还要确保,
set()
CMakeLists.txt
@Tsyvarev中调用
add_library
之前的变量“-lm”表示与数学库链接,以下路径是指向该库的链接?到