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

2024-04-10

我在用着android-cmake http://code.google.com/p/android-cmake/编译 Android 应用程序。这实质上创建了一个 CMake 工具链文件,用于使用 Android NDK 提供的工具链。

As with 这个相关问题 https://stackoverflow.com/questions/5990661/cmake-find-packagethreads-for-android-cross-compilation,我的 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 页面 http://cmake.org/Wiki/CMake_Useful_Variables#Environment_Variables 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)

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


经过大量调试后,我找到了这个问题的解决方案,而且很奇怪。本质上,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}" )

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}" )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMake FindThreads.cmake 找不到我的 pthreads.h 标头 的相关文章

随机推荐

  • Visual Studio 模板参数不返回值?

    我试图在创建 Visual Studio 模板时获取这些参数 但它不返回值 它只是保持这样 string rootnamespace rootnamespace this is the output it just stays as it
  • 添加画布 - Android

    我动态创建画布 Canvas canvas new Canvas 但我怎样才能将它添加到我的 LinearLayout 中呢 LinearLayout ll new LinearLayout this 您可以使用简单的 addView 来完
  • 解决 VS 2017 中的“节点定义冲突”TS4090 错误

    我有一个可以构建并运行的 TypeScript 项目 但我有大量构建错误 这些错误似乎都源于一个错误 TS4090 TS 在 C projectpath node modules types node index d ts 和 C Micr
  • 当通过 setImageBitmap() 设置时,ImageView 将不会显示图像

    我在显示 SD 卡上的现有图像时遇到问题 ImageView photoView ImageView findViewById R id img photo File photoFile new File Environment getEx
  • Firebase - 从数据库节点获取随机子节点

    我正在写一个Firebase Cloud Function这是从一个调用的Android应用程序 该函数应该从用户节点中获取一个随机用户Database 任何随机用户 但不是发送请求的用户 并将其返回给客户端 问题在于数据不是以数组的形式构
  • 如何正确地将日期转换为字符串并以 symfony 形式转换回来,以便可以使用日期选择器

    在我的 Symfony 4 应用程序中 我有一个包含日期类型字段的实体 默认情况下 Symfony 将其呈现为一组月 日 年的选择框 我已将其更改为文本小部件 以便我可以使用 jQuery UI 日期选择器 但我在尝试提交表格时遇到了问题
  • SCOM 上的 PowerShell 无法导入模块

    我有一个问题 如果没有帮助 我无法解决 我在第一台 PC 上有 SCOM 在第二台 PC 上有 SCOM 代理 当我的类在代理 PC 中发现时 它必须运行 PowerShell 脚本 该脚本包含命令 导入模块故障转移集群 但此命令失败并出现
  • 是什么导致 Web 服务 URL 和命名空间之间存在差异?

    我有一个包含 Web 服务的 ASP NET Web 项目 当我运行该服务时 它会将我带到一个显示所有公开方法的页面 使用类似于以下内容的 URLhttp api example com game service asmx 在 Web 服务
  • MySql - 大小 VARCHAR

    很多人对我说设置 VARCHAR 100 没有意义 它与 put 255 相同 我想知道为什么 那是垃圾 他们可能正在谈论这样一个事实 varchar无论最大长度是 100 还是 255 超过该长度的长度将使用两个字节 最多 64K 都使用
  • 关于 NSRunLoop,需要澄清

    When i Logger logger Logger new NSURL url NSURL URLWithString http www google com NSURLRequest request NSURLRequest requ
  • 如何使用 Linq To XML 获取元素值

    使用 Linq To XML 如何从下面的 xml 中获取 space id 值 720 我在读this http msdn microsoft com en us library bb308960 aspx但我认为xml中的命名空间是我的
  • 让 GitLab CI 克隆私有存储库

    我设置了 GitLab 和 GitLab CI 来托管和测试我的一些私人存储库 对于此系统下的作曲家模块 我设置了 Satis 来解析我的私有包 显然这些私有包需要 ssh 密钥来克隆它们 并且我在终端中可以使用它 我可以运行compose
  • ADO.Net (Azure AD) 错误“不支持关键字:身份验证”

    我正在尝试通过 C 代码使用 Azure AD 凭据连接到 Azure 数据库 代码如下 它在我的系统上运行良好 但是当我将它部署到32位VM时 它显示错误 不支持关键字 身份验证 VM 安装了 Net Framework 4 5 但未安装
  • 仅 Detox 测试启动画面

    我正在我的 React Native 项目上运行 detox 并且只能测试启动屏幕 启动屏幕进入登录屏幕 但排毒代码不允许我测试此元素 测试代码 describe Splash gt beforeEach async gt await de
  • java - 如何检查我的对象是否属于给定类的类型?

    我的方法获取 Class 作为参数 我必须检查我的变量是否属于 class 类型 Volvo v1 new Volvo Class aClass v1 getClass check aClass 在里面我需要做类似的事情 v2 instan
  • 输出到另一个窗口

    有没有办法直接在 VB NET 中打开窗体并在第二个监视器中最大化 也就是说 如果显示两个监视器 默认情况下第二个窗口中的表单加载会最大化吗 假设一个程序是用两种形式编写的 并且一台计算机连接了两个显示器 我希望 FormA 默认显示在 M
  • PyCharm:无法使用 docker-compose 创建远程 python 解释器

    尝试在 PyCharm 中创建 docker compose python 解释器时出现错误 解析 Users belek Projects project docker compose yml 时出错 进程docker compose c
  • 按一列中的因素拆分/子集数据框[重复]

    这个问题在这里已经有答案了 我的数据是这样的 例如 ID Rate State 1 24 AL 2 35 MN 3 46 FL 4 34 AL 5 78 MN 6 99 FL Data structure list ID 1 6 Rate
  • 致命错误:AST 文件格式错误或损坏 - Xcode

    在最新版本的 Xcode 中构建我的应用程序时出现此错误 致命错误 AST 文件格式错误或损坏 无法加载模块 Users me Library Developer Xcode DerivedData ModuleCache XYZYIE6Z
  • CMake FindThreads.cmake 找不到我的 pthreads.h 标头

    我在用着android cmake http code google com p android cmake 编译 Android 应用程序 这实质上创建了一个 CMake 工具链文件 用于使用 Android NDK 提供的工具链 As