我有一个C++项目,它在给定的机器上运行流畅,现在我try 用另一个操作系统(XunBunt 14.04)编译它.

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

确定pthread_create函数是否存在于pthreads中失败,输出如下:

克马克主义者.包含编译器标志的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")

我做了一些研究,并try 了以下方法:

-使用了-pthread/-threads/-thread/-lpthreads而不是-lpthread,这并不能解决问题,并且在没有找到以下包的情况下停止生成:

  • 更改了上面cmakelists行中-lpthread的顺序,这会产生相同的错误
  • 使用了不同版本的gcc/g++:try 了4.4、4.6和4.8,没有任何更改
  • 创建了到libpthread的符号链接.所以在/usr/lib/中,没有任何更改

我希望能得到一些帮助,因为我已经不知道下一步该做什么了.

Edit 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-stubs0libc6-dev都在场.

Edit 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()

Edit 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 

推荐答案

运行cmake时出现了问题.不过,在本例中,cmake不是问题所在,错误是silent的,-lpthreads相关的错误/警告是唯一写入cmake错误日志(log)文件的内容,尽管这不会导致任何问题.

提示:搜索实际的错误消息

通常情况下,你会寻找last error message.,然而,在这种情况下,这种(通常有用的)策略会导致误入歧途.

你看到的是CMakeCache.txtCMakeOutput.logCMakeError.log.How comes?当配置阶段的某些宏或测试失败时,CMake"有益地"将这些文件转储到输出.不幸的是,这些文件可能有数千行长,通常包含许多"*** Error: xyz""条目,用于各种配置判断...

Solution:查看top中的日志(log),用配置判断标识该部分,在CMake标识故障并转储其日志(log)的点之前找到last configure check.你也可以try 搜索文本"Configuring incomplete, errors occurred!"

通常,您会在那里找到非常精确的实际错误消息,或者至少找到上次调用的宏或函数的名称/路径,这使您能够精确地指出实际出了什么问题.

Linux相关问答推荐

是否可以在Bash正则表达式中排除?

pci_user_write_config_word在哪里实现?

从 MariaDB 连接到 Oracle 时出现错误消息libsqora.so.11.1:找不到文件

在 Linux 中屏蔽文件中的位 - 按位运算

使用sed命令将记录中的字符串替换为DD-MMM-YYYY日期格式

bind(): "无法分配请求的地址"

Ubuntu 20 不支持 MAP_FIXED_NOREPLACE

x86_64 Linux 程序集中的逻辑与实现

使用具有特定值的字段对文件进行排序

Bash - 如何根据 names.txt 重命名目录中的文件

给定两个目录树如何找到相同的文件?

错误:命令gcc在 CentOS 上失败,退出状态为 1

为什么在 Linux 中使用 select

如何测试是否存在两个文件?

无法在 Android Studio 中清理项目

nvm:无法卸载当前活动的 node 版本

如何在python中找到文件或目录的所有者

在 Linux 上更新 PyCharm

我可以使用 awk 将所有小写字母转换为大写吗?

后缀 - status=bounced(未知用户myuser)