Android C++/Gradle/NDK:我应该将哪些标志传递给 cppFlags、cFlags 或参数?

Android C++/Gradle/NDK: what flags should I pass to cppFlags, cFlags or arguments?

我在这里看到了 NDK 项目的 Gradle 文件的典型示例。

尽管如此,我想知道在何处放置不同标志的规则是什么:

    // Passes optional arguments to CMake.
       arguments "-DANDROID_ARM_NEON=TRUE", "-DANDROID_TOOLCHAIN=clang"
    
    // Sets a flag to enable format macro constants for the C compiler.
       cFlags "-D__STDC_FORMAT_MACROS"
    
   // Sets optional flags for the C++ compiler.
      cppFlags "-fexceptions", "-frtti"

例如,为什么“-fexceptions”、“-frtti”在 'cppFlags' 而不是 'arguments' 中? compilation/appruntime/performance有什么规则决定和影响?

谢谢。

您链接到的代码段清楚地指出了每个设置的受众:

  1. 当 Gradle 需要构建应用程序的本机组件时,它会为范围内的每个 ABI 调用 CMake。因此,arguments 用于 CMake 调用。
  2. CMake 本身并不实际构建您的本机组件,它只是为您的构建系统设置一组文件。通常此工具是 Ninja 或 Make。
  3. cFlagscppFlags 嵌入在各自文件的构建规则中。具有 .c 扩展名的文件是使用 C 编译器构建的,因此它们获得 cFlags,同样地 cppFlags 用于 .cpp.cc。这些标志如何到达各个编译器的确切机制不是很有趣,所以我将跳过它。

回答您的最后一个问题:您需要检查您的 CMakeLists.txt 以查看它查找和解释哪些属性。还有一大堆 CMake built-in variables 可以从命令行设置。

可以参考Clang user's guide and the Clang commandline reference。通常你可以从描述中找出它是 C 还是 C++ 标志。