首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有办法防止CMake在使用CMAKE_ANDROID_STANDALONE_TOOLCHAIN时强制执行工具链布局?

是否有办法防止CMake在使用CMAKE_ANDROID_STANDALONE_TOOLCHAIN时强制执行工具链布局?
EN

Stack Overflow用户
提问于 2018-02-26 13:25:01
回答 1查看 575关注 0票数 0
  • 我使用的是CMake 3.8或更高版本
  • 我使用一个自定义工具链文件来为Android进行配置。
  • 使用NDK的不是选项。

正如标题所示,我想使用一个定制的Android工具链,而不是NDK。问题是,当将CMAKE_SYSTEM_NAME设置为Android并指定CMAKE_ANDROID_STANDALONE_TOOLCHAIN=<path-to-my-toolchain>时,CMake似乎强制执行所述工具链的布局。就像用户不被信任完全配置自己的Android工具链一样?

目前,为了通过配置阶段,我不得不在工具链文件中将CMAKE_SYSTEM_NAME设置为GenericLinux,而且我不太喜欢该解决方案。

如果不让CMake强制执行布局(当然,不修改CMake Android模块),就不可能使用独立的Android工具链吗?

CMake误差输出

它抱怨的第一件事是没有一个sysroot:

代码语言:javascript
复制
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.

如果我修复了上面的错误,接下来的一行是:

代码语言:javascript
复制
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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-26 13:47:06

CMake实现的角度来看,它似乎确实对工具链布局做出了假设。除了CMake文档中指出的必须在指定的CMAKE_ANDROID_STANDALONE_TOOLCHAIN目录下有一个sysroot子目录的要求之外,实现假定${CMAKE_ANDROID_STANDALONE_TOOLCHAIN}/bin/*-gcc${_ANDROID_HOST_EXT}将匹配,其中_ANDROID_HOST_EXTCMAKE_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的任何自动处理。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48989644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档