经过大量的调试后我找到了解决这个问题的方法,这很奇怪.本质上,FindThreads.cmake调用一个名为CHECK_INCLUDE_FILES的宏,该宏尝试TRY_COMPILE一个源文件,该文件只包含提供CHECK_INCLUDE_FILES宏的头文件.

请注意,它确实使用了@sakra建议的CMAKE_REQUIRED_INCLUDES,因此非常有用.

使用android-cmake,TRY_COMPILE宏尝试使用带有所有指定编译标志的NDK中的arm-linux-androideabi-gcc编译器进行编译. android.toolchain.cmake文件包含以下行,用于设置其中一些编译标志:

if( BUILD_WITH_ANDROID_NDK )

set( CMAKE_CXX_FLAGS "--sysroot=\"${ANDROID_NDK_SYSROOT}\" ${CMAKE_CXX_FLAGS}" )

set( CMAKE_C_FLAGS "--sysroot=\"${ANDROID_NDK_SYSROOT}\" ${CMAKE_C_FLAGS}" )

TRY_COMPILE宏失败,并且根据CMakeError.log文件包含以下内容:

Run Build Command:/opt/local/bin/gmake "cmTryCompileExec/fast"

/opt/local/bin/gmake -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build

gmake[1]: Entering directory '/Users/martin/Repositories/Delta/build/android/CMakeFiles/CMakeTmp'

"/Applications/CMake 2.8-4.app/Contents/bin/cmake" -E cmake_progress_report /Users/martin/Repositories/Delta/build/android/CMakeFiles/CMakeTmp/CMakeFiles 1

Building C object CMakeFiles/cmTryCompileExec.dir/CheckIncludeFiles.c.o

/Users/martin/Android/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-gcc --sysroot=;/Users/martin/Android/android-ndk-r7/platforms/android-8/arch-arm" -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb -march=armv7-a -mfloat-abi=softfp " -I/Users/martin/Android/android-ndk-r7/sources/cxx-stl/gnu-libstdc++/include -I/Users/martin/Android/android-ndk-r7/sources/cxx-stl/gnu-libstdc++/libs/armeabi-v7a/include -I/Users/martin/Android/android-ndk-r7/platforms/android-8/arch-arm/usr -I/Users/martin/Android/android-ndk-r7/platforms/android-8/arch-arm/usr/include -o CMakeFiles/cmTryCompileExec.dir/CheckIncludeFiles.c.o -c /Users/martin/Repositories/Delta/build/android/CMakeFiles/CMakeTmp/CheckIncludeFiles.c

arm-linux-androideabi-gcc: no input files

如果您在实际编译器行上向右滚动(从底部开始第二个),您可以看到–sysroot =; / …部分.即使上面的CMake行使用转义字符串,CMake已将第一个转义的引号转换为分号,并将第二个作为正常引号,导致sysroot行中的分号,然后是包含所有CMAKE_CXX_FLAGS的字符串文字(易于看看SO的语法突出显示).

对此的解决方案是修改android.toolchain.cmake以删除转义的引用,因为它们是不必要的.

if( BUILD_WITH_ANDROID_NDK )

set( CMAKE_CXX_FLAGS "--sysroot=${ANDROID_NDK_SYSROOT} ${CMAKE_CXX_FLAGS}" )

set( CMAKE_C_FLAGS "--sysroot=${ANDROID_NDK_SYSROOT} ${CMAKE_C_FLAGS}" )

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐