使用 Android Studio 使用本机代码编译 apk 时如何删除链接中的 libgnustl_static.a?
How remove libgnustl_static.a at linking when compiling apk with native code using Android Studio?
我正在使用 Android Studio (3.4.1) 构建一个包含 C++ 部分的 apk。编译阶段有效,link 阶段抛出错误。
错误:
clang++: error: no such file or directory:
'/Users/homefolder/Library/Android/sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/libs/x86/libgnustl_static.a'
这来自完整 link 命令的最后一行:
/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
,然后它编译并 link 完美。
问题:
我应该在哪里修改 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
经过 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
然后,auto-generated build.ninja 文件不再包含 link 到 libgnustl_static.a。然后 apk 编译。
此修复程序无法发送给我。我虽然 .ExternalNativeBuild
中的所有文件都是 auto-generated 并且在每次新构建时都被删除。名称本身包含 cache
,因此听起来不像是用户应该修改的文件。然而,这是解决我的问题的有效方法。
我相信这些 CCMakeCaches.txt
文件是在第一次构建时生成的,然后 re-used 用于以下构建请求。这对我来说非常不合逻辑。我不明白为什么 set(CMAKE_ANDROID_STL_TYPE none)
不起作用。
And from documentation (1) , it seems like this library can be set up using CMAKE_ANDROID_STL_TYPE. I have put this to 'none' or 'system' in CMakeList.txt, but I see no difference in the build.ninja files.
# 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",
}
}
}
}
我正在使用 Android Studio (3.4.1) 构建一个包含 C++ 部分的 apk。编译阶段有效,link 阶段抛出错误。
错误:
clang++: error: no such file or directory: '/Users/homefolder/Library/Android/sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/libs/x86/libgnustl_static.a'
这来自完整 link 命令的最后一行:
/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
,然后它编译并 link 完美。
问题:
我应该在哪里修改 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
经过 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
然后,auto-generated build.ninja 文件不再包含 link 到 libgnustl_static.a。然后 apk 编译。
此修复程序无法发送给我。我虽然 .ExternalNativeBuild
中的所有文件都是 auto-generated 并且在每次新构建时都被删除。名称本身包含 cache
,因此听起来不像是用户应该修改的文件。然而,这是解决我的问题的有效方法。
我相信这些 CCMakeCaches.txt
文件是在第一次构建时生成的,然后 re-used 用于以下构建请求。这对我来说非常不合逻辑。我不明白为什么 set(CMAKE_ANDROID_STL_TYPE none)
不起作用。
And from documentation (1) , it seems like this library can be set up using CMAKE_ANDROID_STL_TYPE. I have put this to 'none' or 'system' in CMakeList.txt, but I see no difference in the build.ninja files.
# 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",
}
}
}
}