我正在使用android-cmake为 Android 编译应用程序。这实质上创建了一个 CMake 工具链文件,用于使用 Android 的 NDK 提供的工具链。
与此相关问题一样,我的 CMakeLists.txt 文件中的以下行有问题:
find_package(Threads REQUIRED)
Run Code Online (Sandbox Code Playgroud)
头文件位于
~/Android/android-ndk-r7/platforms/android-8/arch-arm/usr/include/pthread.h
Run Code Online (Sandbox Code Playgroud)
库文件位于
~/Android/android-ndk-r7/platforms/android-8/arch-arm/usr/lib/libthread_db.so
Run Code Online (Sandbox Code Playgroud)
问题是 FindThreads.cmake 调用CHECK_INCLUDE_FILES("pthread.h", CMAKE_HAVE_PTHREAD_H),这似乎不费心去检查那个目录。
根据CMake 的有用变量 wiki 页面, CMAKE_INCLUDE_PATH允许设置标题搜索路径,CMAKE_LIBRARY_PATH允许设置库搜索路径,并且CMAKE_PREFIX_PATH似乎为 find_package 提供了两者。
但是,尽管我是否在运行 cmake 之前设置了环境变量...
export CMAKE_INCLUDE_PATH=~/Android/android-ndk-r7/platforms/android-8/arch-arm/usr:~/Android/android-ndk-r7/platforms/android-8/arch-arm/usr/include
Run Code Online (Sandbox Code Playgroud)
...或者我是否直接在 CMakeLists.txt 中设置它们...
if(ANDROID)
set(CMAKE_INCLUDE_PATH
${ANDROID_NDK_SYSROOT}/usr
${ANDROID_NDK_SYSROOT}/usr/include
${CMAKE_INCLUDE_PATH}
)
set(CMAKE_LIBRARY_PATH
${ANDROID_NDK_SYSROOT}/usr
${ANDROID_NDK_SYSROOT}/usr/lib
${CMAKE_LIBRARY_PATH})
set(CMAKE_PREFIX_PATH
${ANDROID_NDK_SYSROOT}
${CMAKE_PREFIX_PATH})
message(${ANDROID_NDK_SYSROOT})
message(${CMAKE_INCLUDE_PATH})
endif()
find_package(Threads REQUIRED)
Run Code Online (Sandbox Code Playgroud)
...(这确实被执行,消息被打印),以及哪里${ANDROID_NDK_SYSROOT}包含
/Users/martin/Android/android-ndk-r7/platforms/android-8/arch-arm
Run Code Online (Sandbox Code Playgroud)
我仍然收到消息
找不到线程(丢失:Threads_FOUND)
有人对我做错了什么有任何建议吗?
经过大量调试,我找到了解决此问题的方法,这很奇怪。本质上,FindThreads.cmake 调用了一个宏,该宏CHECK_INCLUDE_FILES会尝试访问 TRY_COMPILE一个源文件,该文件只包含CHECK_INCLUDE_FILES宏提供的头文件。
请注意,它确实CMAKE_REQUIRED_INCLUDES按照@sakra 的建议使用,因此很有用。
使用 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}" )
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
如果您在实际编译器行(从底部算起第二个)向右滚动,您可以看到该--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}" )
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7047 次 |
| 最近记录: |