首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CMake FindThreads.cmake找不到我的pthreads.h头

CMake FindThreads.cmake找不到我的pthreads.h头
EN

Stack Overflow用户
提问于 2011-12-05 14:35:26
回答 2查看 7.6K关注 0票数 7

我正在使用安卓-cmake为Android编译一个应用程序。这实际上创建了一个CMake工具链文件,用于使用Android提供的工具链。

这个相关的问题一样,我的CMakeLists.txt文件中的以下行也有问题:

代码语言:javascript
复制
find_package(Threads REQUIRED)

头文件位于

代码语言:javascript
复制
~/Android/android-ndk-r7/platforms/android-8/arch-arm/usr/include/pthread.h

库文件位于

代码语言:javascript
复制
~/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之前是否设置了环境变量.

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

代码语言:javascript
复制
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}包含的

代码语言:javascript
复制
/Users/martin/Android/android-ndk-r7/platforms/android-8/arch-arm

我还是收到消息了

找不到线程(丢失: Threads_FOUND)

有人对我做错了什么有什么建议吗?

EN

回答 2

Stack Overflow用户

发布于 2011-12-05 15:36:59

设置CMAKE_INCLUDE_PATH只会影响CMake、find_filefind_path命令。由CHECK_INCLUDE_FILES调用的FindThreads.cmake函数不符合该变量。对于CHECK_INCLUDE_FILES,可以设置变量CMAKE_REQUIRED_INCLUDES

代码语言:javascript
复制
set(CMAKE_REQUIRED_INCLUDES 
  ${ANDROID_NDK_SYSROOT}/usr 
  ${ANDROID_NDK_SYSROOT}/usr/include)
票数 4
EN

Stack Overflow用户

发布于 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"编译程序来解释这里,而在成功的情况下,它会假装找到了一个包。

那么为什么它会失败呢?在我的环境中,在研究了宏之后,我发现它失败了,并出现了以下错误

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

代码语言:javascript
复制
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。比我聪明的人可能想要这些信息。

代码语言:javascript
复制
include(CheckIncludeFile)
CHECK_INCLUDE_FILE("pthread.h" TEST)
message("TEST: ${TEST}")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8386897

复制
相关文章

相似问题

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