我正在使用安卓-cmake为Android编译一个应用程序。这实际上创建了一个CMake工具链文件,用于使用Android提供的工具链。
与这个相关的问题一样,我的CMakeLists.txt文件中的以下行也有问题:
find_package(Threads REQUIRED)头文件位于
~/Android/android-ndk-r7/platforms/android-8/arch-arm/usr/include/pthread.h库文件位于
~/Android/android-ndk-r7/platforms/android-8/arch-arm/usr/lib/libthread_db.so问题是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..。或者我是否直接把它们放在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)..。(这确实会被执行,消息将被打印出来),以及${ANDROID_NDK_SYSROOT}包含的
/Users/martin/Android/android-ndk-r7/platforms/android-8/arch-arm我还是收到消息了
找不到线程(丢失: Threads_FOUND)
有人对我做错了什么有什么建议吗?
发布于 2011-12-05 15:36:59
发布于 2021-12-18 00:47:41
好的,我在CMake 3.18.1-g262b901,NDK 21.4.7075529,Android 2020.3.1上。
正如您可能知道的那样,这个问题正在出现,因为android在libc++中包含了libc++,因此没有用于p线程的包。FindThreads.cmake文件是find_package(Threads REQUIRED)使用的,它试图通过使用#include "pthread.h"编译程序来解释这里,而在成功的情况下,它会假装找到了一个包。
那么为什么它会失败呢?在我的环境中,在研究了宏之后,我发现它失败了,并出现了以下错误
error: invalid argument '-std=c++11' not allowed with 'C'似乎android环境将此标志设置为编译器,甚至是C代码。
什么修好了?
在失败的调用中添加以下代码,将CMAKE_C_COMPILER_LOADED设置为false,而find_package(Threads REQUIRED)正在计算时,应该使FindThreads.cmake使用CHECK_INCLUDE_FILE_CXX而不是C版本。
set(CMAKE_C_COMPILER_LOADED 0)
#Your failing instruction
set(CMAKE_C_COMPILER_LOADED 1)注意:--如果您能够访问导致错误的CMake文件,那么首先不可能进行find_package(Threads REQUIRED)调用。在android环境中,#include "pthread.h"调用应该可以正常工作,而不需要任何额外的断言。
Curiously...在我的顶级CMakeLists.txt上,下面的计算结果为true。比我聪明的人可能想要这些信息。
include(CheckIncludeFile)
CHECK_INCLUDE_FILE("pthread.h" TEST)
message("TEST: ${TEST}")https://stackoverflow.com/questions/8386897
复制相似问题