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有什么规则决定和影响?
谢谢。
您链接到的代码段清楚地指出了每个设置的受众:
- 当 Gradle 需要构建应用程序的本机组件时,它会为范围内的每个 ABI 调用 CMake。因此,
arguments
用于 CMake 调用。
- CMake 本身并不实际构建您的本机组件,它只是为您的构建系统设置一组文件。通常此工具是 Ninja 或 Make。
cFlags
和 cppFlags
嵌入在各自文件的构建规则中。具有 .c
扩展名的文件是使用 C 编译器构建的,因此它们获得 cFlags
,同样地 cppFlags
用于 .cpp
或 .cc
。这些标志如何到达各个编译器的确切机制不是很有趣,所以我将跳过它。
回答您的最后一个问题:您需要检查您的 CMakeLists.txt 以查看它查找和解释哪些属性。还有一大堆 CMake built-in variables 可以从命令行设置。
可以参考Clang user's guide and the Clang commandline reference。通常你可以从描述中找出它是 C 还是 C++ 标志。
我在这里看到了 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有什么规则决定和影响?
谢谢。
您链接到的代码段清楚地指出了每个设置的受众:
- 当 Gradle 需要构建应用程序的本机组件时,它会为范围内的每个 ABI 调用 CMake。因此,
arguments
用于 CMake 调用。 - CMake 本身并不实际构建您的本机组件,它只是为您的构建系统设置一组文件。通常此工具是 Ninja 或 Make。
cFlags
和cppFlags
嵌入在各自文件的构建规则中。具有.c
扩展名的文件是使用 C 编译器构建的,因此它们获得cFlags
,同样地cppFlags
用于.cpp
或.cc
。这些标志如何到达各个编译器的确切机制不是很有趣,所以我将跳过它。
回答您的最后一个问题:您需要检查您的 CMakeLists.txt 以查看它查找和解释哪些属性。还有一大堆 CMake built-in variables 可以从命令行设置。
可以参考Clang user's guide and the Clang commandline reference。通常你可以从描述中找出它是 C 还是 C++ 标志。