【问题标题】:Android CMake: how to check if cppFlags and arguments are taken into account at compile time?Android CMake:如何检查编译时是否考虑了 cppFlags 和参数?
【发布时间】:2021-09-21 18:44:47
【问题描述】:

我有一个 Android/NDK/JNI/Java/C++ 项目。

我有一个如下所示的 Gradle 文件:

....
 cmake {
                cppFlags "-std=c++11 -fexceptions"
                arguments "-DANDROID_STL=c++_static"
            }
....

我的问题是:如何检查我的 Android 项目编译时是否充分考虑了这些标志和参数?

谢谢

【问题讨论】:

  • 已拍摄。但如果您想查看所有标志,包括这些标志,只需检查 cmake 缓存文件夹中生成的 make 文件。我的要复杂得多,并且有多种选择。

标签: android c++ cmake android-ndk java-native-interface


【解决方案1】:

我有一个大的 cmake 文件,其中的部分如下:

            cmake {
                arguments "-DANDROID_TOOLCHAIN=clang", "-DANDROID_STL=c++_static"
                cFlags "-D__STDC_FORMAT_MACROS", "-fno-integrated-as", "-fvisibility=hidden"
                cppFlags "-fexceptions", "-frtti", "-fno-integrated-as", "-fvisibility=hidden"
            }

//...
        flavorDimensions "mode"

        productFlavors {
            normal {
                dimension "mode"
                externalNativeBuild {
                    cmake {
                        cFlags "-DNORMAL"
                        cppFlags "-DNORMAL"
                    }
                }
            }
            demo {
                dimension "mode"
                externalNativeBuild {
                    cmake {
                        cFlags "-DDEMO"
                        cppFlags "-DDEMO"
                    }
                }
            }
        }

并考虑所有选项。但是如果需要,您可以检查 cmake 缓存文件。构建文件名为build.ninja,您可以在.cxx 文件夹内的项目变体文件夹中找到它。

一般来说,arguments 是传递给 cmake 的参数,但 cppFlags 是传递给编译器的标志。

【讨论】:

  • 谢谢。您在哪里可以找到这些缓存文件?
  • @Regis_AG 在较新版本的 android studio 中,缓存在 .cxx 文件夹中。进去直到你到达你的变体文件夹。然后寻找build.ninja 文件。你可以在里面看到flag,因为android默认使用ninja构建系统。
  • 谢谢。确实,我似乎在那里看到了我的旗帜。顺便说一句,我怎么知道我应该在“cppFlags”还是“arguments”中添加一个标志?
  • @Regis_AG 我不确定是否有必要定义这些标志。因为当您的构建类型更改时,cmake 本身会自动更改一些标志,所以我认为应该在同步项目以进行发布构建时定义这些标志。但一般来说,这些标志会转到cppflags。但正如我所提到的,首先尝试构建发布版本,您可能会看到这些标志。请记住,android studio/gradle 和 cmake 都在试图简化流程,所以如果你戳太多,你可能会得到更糟糕的结果。
  • @Regis_AG 您将需要调试模式来调试您的代码,并且您的产品将以更高的速度以发布模式发布,所以我认为这不是问题,应该是这样的。但是你需要有用于调试和发布的发布 dll,我认为可以通过依赖你的主项目来发布 C++ 库的版本。但我的建议是,不要这样做。你需要调试你的代码。
猜你喜欢
  • 2021-08-24
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
  • 2016-10-26
  • 1970-01-01
  • 2013-08-16
相关资源
最近更新 更多