【发布时间】: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_TYPE,ANDROID_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