使用cmake构建错误:找不到-lpthreads

时间:2015-08-11 17:44:30

标签: c++ linux cmake pthreads

我的c ++项目在给定的机器上运行顺畅,现在我正在尝试使用相同的操作系统(Xubuntu 14.04)在另一台机器上编译它。

我已经安装了所有依赖项,并且我正在使用cmake来构建项目,尽管它因以下错误而停止:

  
    

使用以下输出确定pthreads中是否存在pthread_create函数失败:     ...     / usr / bin / ld:找不到-lpthreads

  

包含编译器标志的cmakelists.txt行如下:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3 -lpthread -DNDEBUG -DEIGEN_MPL2_ONLY")
set(CMAKE_C_FLAGS_DEBUG "-g -O0 -Wall -lpthread -DEIGEN_MPL2_ONLY")
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -O3 -lpthread -I/usr/include/freetype2 -DNDEBUG -DEIGEN_MPL2_ONLY")
set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -Wall -lpthread -I/usr/include/freetype2 -DEIGEN_MPL2_ONLY")

我做了一些研究,并且已经尝试了以下内容:

-used -pthread / -threads / -thread / -lpthreads而不是-lpthread,它不能解决问题并使构建停止而不会找到以下包: find_package (Threads)

  • 在上面的cmakelists行中更改了-lpthread的顺序,这给出了同样的错误
  • 使用了不同版本的gcc / g ++:试过4.4,4.6和4.8,没有任何改变
  • 在/ usr / lib /中创建了一个指向libpthread.so的符号链接,没有任何更改

我很感激一些帮助,因为我已经很想知道下一步该尝试什么。

修改1

图书馆应该在哪里:

$ find /lib -name "*pthread*"
/lib/x86_64-linux-gnu/libpthread-2.19.so
/lib/x86_64-linux-gnu/libpthread.so.0

还找到了pthread_create:

$ nm /lib/x86_64-linux-gnu/libpthread.so.0 | grep "pthread_create"
0000000000008430 t __pthread_create_2_1
00000000000081430 T pthread_create@@GLIBC_2.2.5

我还验证了 libpthread-stubs0 libc6-dev 都存在。

修改2

这是 FindThreads.cmake 文件内容的一部分,位于/usr/share/cmake-2.8/Modules /:

if(CMAKE_HAVE_SPROC_H AND NOT CMAKE_THREAD_PREFER_PTHREAD)
  # We have sproc
  set(CMAKE_USE_SPROC_INIT 1)
else()
  # Do we have pthreads?
  CHECK_INCLUDE_FILES("pthread.h" CMAKE_HAVE_PTHREAD_H)
  if(CMAKE_HAVE_PTHREAD_H)

    #
    # We have pthread.h
    # Let's check for the library now.
    #
    set(CMAKE_HAVE_THREADS_LIBRARY)
    if(NOT THREADS_HAVE_PTHREAD_ARG)
      # Check if pthread functions are in normal C library
      CHECK_SYMBOL_EXISTS(pthread_create pthread.h CMAKE_HAVE_LIBC_CREATE)
      if(CMAKE_HAVE_LIBC_CREATE)
        set(CMAKE_THREAD_LIBS_INIT "")
        set(CMAKE_HAVE_THREADS_LIBRARY 1)
        set(Threads_FOUND TRUE)
      endif()

      if(NOT CMAKE_HAVE_THREADS_LIBRARY)
        # Do we have -lpthreads
        CHECK_LIBRARY_EXISTS(pthreads pthread_create "" CMAKE_HAVE_PTHREADS_CREATE)
        if(CMAKE_HAVE_PTHREADS_CREATE)
          set(CMAKE_THREAD_LIBS_INIT "-lpthreads")
          set(CMAKE_HAVE_THREADS_LIBRARY 1)
          set(Threads_FOUND TRUE)
        endif()

        # Ok, how about -lpthread
        CHECK_LIBRARY_EXISTS(pthread pthread_create "" CMAKE_HAVE_PTHREAD_CREATE)
        if(CMAKE_HAVE_PTHREAD_CREATE)
          set(CMAKE_THREAD_LIBS_INIT "-lpthread")
          set(CMAKE_HAVE_THREADS_LIBRARY 1)
          set(Threads_FOUND TRUE)
        endif()

        if(CMAKE_SYSTEM MATCHES "SunOS.*")
          # On sun also check for -lthread
          CHECK_LIBRARY_EXISTS(thread thr_create "" CMAKE_HAVE_THR_CREATE)
          if(CMAKE_HAVE_THR_CREATE)
            set(CMAKE_THREAD_LIBS_INIT "-lthread")
            set(CMAKE_HAVE_THREADS_LIBRARY 1)
            set(Threads_FOUND TRUE)
          endif()
        endif()
      endif()
    endif()

    if(NOT CMAKE_HAVE_THREADS_LIBRARY)
      # If we did not found -lpthread, -lpthread, or -lthread, look for -pthread
      if("THREADS_HAVE_PTHREAD_ARG" MATCHES "^THREADS_HAVE_PTHREAD_ARG")
        message(STATUS "Check if compiler accepts -pthread")
        try_run(THREADS_PTHREAD_ARG THREADS_HAVE_PTHREAD_ARG
          ${CMAKE_BINARY_DIR}
          ${CMAKE_ROOT}/Modules/CheckForPthreads.c
          CMAKE_FLAGS -DLINK_LIBRARIES:STRING=-pthread
          COMPILE_OUTPUT_VARIABLE OUTPUT)

        if(THREADS_HAVE_PTHREAD_ARG)
          if(THREADS_PTHREAD_ARG STREQUAL "2")
            set(Threads_FOUND TRUE)
            message(STATUS "Check if compiler accepts -pthread - yes")
          else()
            message(STATUS "Check if compiler accepts -pthread - no")
            file(APPEND
              ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
              "Determining if compiler accepts -pthread returned ${THREADS_PTHREAD_ARG} instead of 2. The compiler had the following output:\n${OUTPUT}\n\n")
          endif()
        else()
          message(STATUS "Check if compiler accepts -pthread - no")
          file(APPEND
            ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
            "Determining if compiler accepts -pthread failed with the following output:\n${OUTPUT}\n\n")
        endif()

      endif()

      if(THREADS_HAVE_PTHREAD_ARG)
        set(Threads_FOUND TRUE)
        set(CMAKE_THREAD_LIBS_INIT "-pthread")
      endif()

    endif()
  endif()
endif()

编辑3

使用最小的Cmakelists.txt,如下所示:

cmake_minimum_required (VERSION 2.4)
find_package(Threads)

产生了以下输出:

-- Looking for include file pthread.h
-- Looking for include file pthread.h - found
-- Looking for pthread_create
-- Looking for pthread_create - not found.
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE 

9 个答案:

答案 0 :(得分:4)

在Ubuntu 18.04.1 LTS上,此安装为我提供了所需的所有文件:

apt -y install libboost-tools-dev libboost-thread1.62-dev magics++

/usr/lib/x86_64-linux-gnu/libpthread.a
/usr/lib/x86_64-linux-gnu/libpthread.so
/usr/lib/x86_64-linux-gnu/libpthread_nonshared.a

之后没有更多错误“ / usr / bin / ld:找不到-lpthreads”

答案 1 :(得分:2)

我发现了造成我问题的原因。我最初使用cmake2做到了,但是项目需要cmake3。我将其更改为cmake3,但是它没有进行干净的构建,因此一些剩余的垃圾将所有内容弄乱了。当我清理所有东西并使用cmake3时,它起作用了。

答案 2 :(得分:1)

<强> EDIT1:

以下所有引用均适用于Ubuntu。

名为libpthread-stubs0的程序包可能只是一个存根,因此不具有pthread_create功能。

你有吗?

$ find /lib -name "*pthread*"
/lib/x86_64-linux-gnu/libpthread-2.15.so
/lib/x86_64-linux-gnu/libpthread.so.0

检查应存在的符号pthread_create

$ nm /lib/x86_64-linux-gnu/libpthread.so.0 | grep "pthread_create"
0000000000008140 t __pthread_create_2_1
0000000000008140 T pthread_create@@GLIBC_2.2.5

如果这不起作用,您可能需要pthread中的libc6-dev开发版本。您可以搜索http://packages.ubuntu.com/中包含libpthread.so的包裹内容。

注意:此外,-lpthreads失败了。它应该是-lpthread而不是s)吗?

修改2

使用以下内容创建一个简单的CMakeLists.txt并运行cmake

cmake_minimum_required (VERSION 2.8.7)
find_package(Threads)

输出是什么?它找到了pthread吗?

我的输出是:

-- Looking for include file pthread.h
-- Looking for include file pthread.h - found
-- Looking for pthread_create
-- Looking for pthread_create - not found.
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE 

答案 3 :(得分:1)

运行cmake时出现问题。但是,在这种情况下,cmake并不是问题,错误是静默的,并且-lpthreads相关的错误/警告是唯一写入cmake错误日志文件的内容,尽管这不会引起任何问题。 我已经完成了cmakelists.txt的最低版本,并开始逐行对其进行测试,直到找到导致它停止的软件包:最终我发现这是一个版本不匹配...

答案 4 :(得分:0)

这似乎是一个长期存在的CMake错误。发生其他问题,CMake感到困惑,并报告了这个虚假问题,而不是真正的错误。

在您的CMakeLists.txt文件中查找“线程”,并将其暂时删除。

就我而言,这立即指出了缺少的库(或更确切地说是其开发包)。安装后,将其添加到debian/control的{​​{1}}部分,重新​​编译,一切正常。

答案 5 :(得分:0)

请尝试安装一个依赖项glibc-static

在Ubuntu上,您可以尝试apt-get install build-essential

在其他Linux上,您可以安装类似于glibc-static的软件包。

答案 6 :(得分:0)

在ubuntu 18.04上,我如下解决。

$ sudo apt-get install libboost-all-dev

答案 7 :(得分:0)

我遇到了完全相同的问题,最小的Cmakelists.txt给了我相同的输出。 要解决此问题,只需升级cmake到lastest version (在我的情况下为3.15)

答案 8 :(得分:0)

我也遇到了这个问题。完全相同的情况:在 /lib/x86... 下有 pthread lib,但 find_package() 总是给出“找不到 lpthread 错误”。 经过与朋友的一些检查和咨询,我们发现在我的情况下,我从源代码构建了 cmake,并让 cmake 链接搜索路径错误。因此,我们卸载自建版本并通过添加 apt 源并使用 apt get install 以“正确”的方式重新安装 cmake。这解决了我的问题。希望这可以帮助处于相同情况的人。