【问题标题】:CMake : FIND_PACKAGE(Threads) for Android cross-compilationCMake:用于 Android 交叉编译的 FIND_PACKAGE(Threads)
【发布时间】:2011-08-24 20:12:59
【问题描述】:

我正在使用 Android NDK 和 Cmake 来生成我的项目的共享库。

我正在将现有项目从 Ubuntu 移植到 Android,现在我需要移植一些可执行文件。我成功编译了所有需要 Threads 库的可执行文件 sexecpt 一个。

在 CMakeList.txt 中,FIND_PACKAGE(Threads) 在为 Ubuntu 编译时找到该库,但在 Android 上没有。

我关注了这个cmake and libpthread,但没有成功。

我认为我应该编写 FindThread.cmake 文件,但我对 CMake 还很陌生,并不真正知道该怎么做,尤其是因为我不知道 Android 的线程库在哪里。

任何帮助将不胜感激。 谢谢

【问题讨论】:

  • 您找到解决方案了吗? FindThread.cmake 似乎忽略了 CMAKE_PREFIX_PATH。

标签: android pthreads cmake android-ndk


【解决方案1】:

在Android 下,不需要FIND_PACKAGE(Threads),因为Android libc 标准库(称为“仿生”)已经包含threads.hpthread.h 中的相关函数。该支持尚未完全符合 POSIX 标准和 differs by API level,但对于大多数情况来说已经足够了。

因此,您可以跳过查找和链接到外部线程库。如果您的 CMake 文件用于跨平台使用,则它看起来像这样:

set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
set(THREADS_PREFER_PTHREAD_FLAG TRUE)

if(NOT CMAKE_SYSTEM_NAME STREQUAL "Android")
    find_package(Threads REQUIRED)
    target_link_libraries (your-target-name PRIVATE Threads::Threads)
endif()

【讨论】:

  • 虽然这个解决方案有效,但它并不是最优雅的方式。 KDE ECM(“Extra CMake Modules”)为此实现了一个更惯用的解决方案,模拟在 Android 上找到 Threads 库。你可以检查他们的来源。仍然需要再次找到它并在我的答案中引用它。
【解决方案2】:

您不需要编写自己的 FindThread.cmake。在标准的 linux 安装中,可以在 /usr/share/cmake-2.8/Modules/ 中找到它。

检查此 Modules/ 目录可能安装在您的平台上的位置。

【讨论】:

    猜你喜欢
    • 2017-05-08
    • 2019-07-30
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多