【问题标题】:How can I prevent Gradle/Android Studio from overwriting C++ compiler settings provided by CMake?如何防止 Gradle/Android Studio 覆盖 CMake 提供的 C++ 编译器设置?
【发布时间】:2016-10-25 13:40:55
【问题描述】:

我正在尝试将我现有的 CMake 脚本集成到 Android Studio / Gradle 中。我已经使用 CMake 生成和构建它,但无论出于何种原因,我在我的 CMake 脚本中指定的 CPP 标志在通过 Gradle 运行时都没有被使用。我希望我的 CMake 脚本能够完全控制 -std=c++14-fexceptions 等设置。我真正需要 Gradle 做的只是提供一个工具链文件来指定工具集信息(编译器、包含的路径等)。我猜 Gradle 正试图对 CMake 进行不必要的控制(至少据我所知)。

有没有办法让 Gradle 不覆盖这些 CMake 设置?在 Gradle 和 CMake 脚本之间维护和复制这些设置会很痛苦。到目前为止,我真的不是 CMake 的 Gradle 集成的粉丝,他们似乎使用自己的带有自定义补丁的手工构建版本。

【问题讨论】:

    标签: android c++ android-studio gradle cmake


    【解决方案1】:

    Gradle 不会覆盖任何 CMake c++ 标志。您看到的可能是 Android SDK CMake 工具链,它设置工具、c++ 标志和每个 ABI 配置。

    以下是 gradle 调用 CMake 的方式:

    {root}/Sdk/cmake/3.6.3155560/bin/cmake
    -H{project}/app
    -B{project}/app/.externalNativeBuild/cmake/debug/arm64-v8a
    -GAndroid Gradle - Ninja
    -DANDROID_ABI=arm64-v8a
    -DANDROID_NDK={root}/Sdk/ndk-bundle
    -DCMAKE_LIBRARY_OUTPUT_DIRECTORY={project}/app/build/intermediates/cmake/debug/obj/arm64-v8a
    -DCMAKE_BUILD_TYPE=Debug
    -DCMAKE_MAKE_PROGRAM={root}/Sdk/cmake/3.6.3155560/bin/ninja
    -DCMAKE_TOOLCHAIN_FILE={root}/Sdk/ndk-bundle/build/cmake/android.toolchain.cmake
    -DANDROID_PLATFORM=android-21
    

    您可以通过查看 gradle 生成的 cmake_build_output.txt 文件之一来了解您的特定情况。

    您可以查看 android.toolchain.cmake 以了解工具链何时以及如何设置特定标志。 (您可以打开该文件上的错误并通过访问 b.android.com 提供反馈。如果您抄送我--jomof@google.com--我会确保将其发送给正确的人)。我们肯定也计划加强文档,您也可以打开错误以获得改进文档的建议。

    您应该能够将自己的标志(例如 -fexceptions)附加到工具链设置的内容中,并且您的值将覆盖任何先前的值。如果这不是您所看到的,您能否提供有关如何设置 CMakeLists.txt 的更多详细信息?

    【讨论】:

    • 不,如果我直接使用 CMake 生成并直接指向 NDK 工具链文件,它不会覆盖我的编译器标志。所以肯定是 Android Studio / Gradle 在做一些特别的事情。看起来他们使用的是单独的工具链文件,而不是 NDK r12 提供的工具链文件
    • 你能提供一个重现吗?
    猜你喜欢
    • 2022-10-05
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 2023-03-04
    • 1970-01-01
    • 2018-02-10
    • 2013-04-14
    • 1970-01-01
    相关资源
    最近更新 更多