正如标题所示,我有一个我想使用的自定义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工具链?
它抱怨的第一件事是没有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
- 文件夹这一事实。
答案 0 :(得分:1)
查看CMake implementation,它似乎确实对工具链布局做出了假设。除了CMake docs中所述的要求之外,在指定的sysroot
目录下必须有CMAKE_ANDROID_STANDALONE_TOOLCHAIN
子目录,该实现假定将存在${CMAKE_ANDROID_STANDALONE_TOOLCHAIN}/bin/*-gcc${_ANDROID_HOST_EXT}
的匹配项,其中_ANDROID_HOST_EXT
1}}在Windows上为.exe
,否则为空。然后继续使用更多的逻辑,但如果工具链是基于gcc的,它应该没问题。
更深入地看一下实现,如果设置ANDROID_STANDALONE_TOOLCHAIN
环境变量而不是CMAKE_ANDROID_STANDALONE_TOOLCHAIN
CMake变量,它会绕过sysroot检查(更准确地说,检查{{1在sysroot下的路径下的文件)。如果你这样做,那么之后,CMake仍然会尝试确定API级别,首先查找api-level.h
并在找到时查询它,或者再次查找<sysroot>/bin/clang
文件。如果您的工具链没有api-level.h
,那么您可以将未记录的和内部 CMake变量<sysroot>/bin/clang
设置为API,以防止CMake查看为了要求_ANDROID_STANDALONE_TOOLCHAIN_API
。你通常不会依赖这样的内部事物,因为它可能随着任何未来的CMake版本而改变,但这将是你想要做的事情的代价。
如果您不想依赖内部细节,那么将api-level.h
设置为CMAKE_SYSTEM_NAME
并手动设置工具链详细信息就像任何其他非Android版本一样,可能是您的最佳选择。然后,您将需要设置所有相关的编译器和链接器标志等,就像任何其他交叉编译情况一样,因为它不会触发任何CMake对Android的自动处理。