正如标题所示,我想使用一个定制的Android工具链,而不是NDK。问题是,当将CMAKE_SYSTEM_NAME设置为Android并指定CMAKE_ANDROID_STANDALONE_TOOLCHAIN=<path-to-my-toolchain>时,CMake似乎强制执行所述工具链的布局。就像用户不被信任完全配置自己的Android工具链一样?
目前,为了通过配置阶段,我不得不在工具链文件中将CMAKE_SYSTEM_NAME设置为Generic或Linux,而且我不太喜欢该解决方案。
如果不让CMake强制执行布局(当然,不修改CMake Android模块),就不可能使用独立的Android工具链吗?
CMake误差输出
它抱怨的第一件事是没有一个sysroot:
CMake Error at /usr/local/share/cmake-3.8/Modules/Platform/Android-Determine.cmake:74 (message):
Android: The standalone toolchain directory specified by CMAKE_ANDROID_STANDALONE_TOOLCHAIN:
/home/<path-to-toolchain>
does not contain a sysroot with a known layout. The file:
/home/<path-to-toolchain>/sysroot/usr/include/android/api-level.h
does not exist.如果我修复了上面的错误,接下来的一行是:
CMake Error at /usr/local/share/cmake-3.8/Modules/Platform/Android/Determine-Compiler-Standalone.cmake:16 (message):
Android: No '*-gcc' compiler found in CMAKE_ANDROID_STANDALONE_TOOLCHAIN:造成此错误的原因是,CMake期望主工具链文件夹中包含gcc工具链的bin-folder。
发布于 2018-02-26 13:47:06
从CMake实现的角度来看,它似乎确实对工具链布局做出了假设。除了CMake文档中指出的必须在指定的CMAKE_ANDROID_STANDALONE_TOOLCHAIN目录下有一个sysroot子目录的要求之外,实现假定${CMAKE_ANDROID_STANDALONE_TOOLCHAIN}/bin/*-gcc${_ANDROID_HOST_EXT}将匹配,其中_ANDROID_HOST_EXT在CMAKE_ANDROID_STANDALONE_TOOLCHAIN上为.exe,否则为空。然后,它继续以更多的逻辑,但如果工具链是以gcc为基础,它应该是好的。
更深入地研究实现,如果您设置ANDROID_STANDALONE_TOOLCHAIN环境变量而不是CMAKE_ANDROID_STANDALONE_TOOLCHAIN CMake变量,它将绕过sysroot检查(更准确地说,在sysroot下的路径上检查api-level.h文件)。如果您这样做,那么在此之后,CMake仍将尝试通过首先查找<sysroot>/bin/clang并在找到时查询它,或者再次查找api-level.h文件来确定API级别。如果您的工具链没有<sysroot>/bin/clang,那么您可以将无文档和内部的CMake变量_ANDROID_STANDALONE_TOOLCHAIN_API设置为API,以防止CMake查找和需要api-level.h。通常情况下,您不希望依赖于类似于这种内部的东西,因为它可能会随着将来的CMake发行而改变,但这将是您想要做的事情的代价。
如果您不想依赖内部细节,那么将CMAKE_SYSTEM_NAME设置为Linux并像其他非Android构建一样手动设置工具链细节可能是最好的选择。然后,您将需要设置所有相关的编译器和链接器标志等,就像任何其他交叉编译情况一样,因为它不会触发CMake对Android的任何自动处理。
https://stackoverflow.com/questions/48989644
复制相似问题