在使用Android Studio使用本机代码编译apk时,如何删除libgnustl_static.a at链接? 我使用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/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文件夹中不存在此库。文件夹在使用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
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
.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”表示与数学库链接,以下路径是指向该库的链接?到