【发布时间】:2015-02-02 18:28:49
【问题描述】:
我目前正在尝试在 Ubuntu 14.04 LTS 上编译 https://github.com/OpenKinect/libfreenect,但它失败了。在 CMake 日志中,我看到有关“-pthreads”库的错误未找到,但它发现“-pthread”没有问题。两者有什么区别? Ubuntu 上的 -pthreads 是否有任何特定的软件包?
【问题讨论】:
我目前正在尝试在 Ubuntu 14.04 LTS 上编译 https://github.com/OpenKinect/libfreenect,但它失败了。在 CMake 日志中,我看到有关“-pthreads”库的错误未找到,但它发现“-pthread”没有问题。两者有什么区别? Ubuntu 上的 -pthreads 是否有任何特定的软件包?
【问题讨论】:
根据 GCC 手册页,-pthread 和 -pthreads 是特定于体系结构的标志。这些标志并非都适用于所有拱门。如果两个标志都可用,它们似乎是彼此的同义词。因此,在没有看到您确切的错误输出的情况下,我最好的猜测是您遇到的错误是 GCC 的“-pthreads”标志不适用于您的架构。
我建议您阅读编译器的手册页,以获取有关您的特定编译器构建可用哪些选项的更多信息。
【讨论】:
您应该尽可能避免硬编码特定于架构的标志,例如 -pthread。而是尽可能将它们隐藏在构建系统的深处,以便在需要将项目移植到需要不同标志的新平台时轻松调整它们。
特别是对于线程,更喜欢FindThreads module 而不是硬编码参数:
find_package(Threads)
target_link_libraries(myExecutable Threads::Threads)
当您在第三方库中遇到问题时,如果您认为这是阻止它在您的平台上编译的唯一原因,您可能需要提交错误报告/提交有关该问题的补丁。
【讨论】:
-pthread 和 -pthreads 是编译器开关。 Pthreads 或 POSIX 线程是规范的名称,Linux 中的实现是“LinuxThreads”,NPTL 都由 GNU libc 提供,后者更新。 getconf GNU_LIBPTHREAD_VERSION 显示了实现。 man 7 pthreads 指示在编译使用 Pthread 的程序时使用“-pthread”。
安装“libpthread-stubs0-dev”包后重试。
【讨论】: