web-dev-qa-db-ja.com

cmakeを使用した構築エラー:-lpthreadsが見つかりません

特定のマシンでスムーズに実行されていたc ++プロジェクトがあり、同じオペレーティングシステム(Xubuntu 14.04)で別のマシンでコンパイルしようとしています。

すべての依存関係をインストールし、cmakeを使用してプロジェクトをビルドしていますが、次のエラーで停止します。

関数pthread_createがpthreadsに存在するかどうかの判断は、次の出力で失敗しました。../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の代わりに-lpthreadsを使用すると、問題が解決せず、次のパッケージが見つからずにビルドが停止します: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-stubslibc6-devの両方が存在することも確認しました。

編集2

これは、/ usr/share/cmake-2.8/Modules /にあるFindThreads.cmakeファイルコンテンツの一部です。

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

編集

次のように最小限の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 
_
23
Sapiens

問題はcmakeの実行中に発生していました。ただし、この場合、cmakeは問題ではなく、エラーは静かであり、-lpthreads関連のエラー/警告のみがcmakeエラーログファイルに書き込まれましたが、それは問題を引き起こしていませんでした。私はcmakelists.txtの最小バージョンを作成し、どのパッケージが停止を引き起こしているのかを見つけるまで、行ごとにテストを開始しました:最終的にバージョンの不一致が見つかりました...

0
Sapiens

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が見つかりません"がなくなりました

4
fometeo

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

それが機能しない場合は、libc6-devにあるpthreadの開発バージョンが必要になる場合があります。 http://packages.ubuntu.com/libpthread.soを含むパッケージの内容を検索できます。

注:また、-lpthreadsで失敗します。代わりに-lpthreadsなし)にする必要がありますか?

Edit 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 
1
ap-osd

ubuntu 18.04で以下のように解決しました。

$ Sudo apt-get install libboost-all-dev
0
Paul Go

最小限のCmakelists.txtで同じ出力が得られるというまったく同じ問題がありました。これを解決するには、cmakeを 最新バージョン(私の場合は3.15)にアップグレードするだけです

0
kaios

これは長年のCMakeバグのようです。他の何かがうまくいかず、CMakeが混乱し、実際のエラーの代わりにこの偽の問題を報告します。

CMakeLists.txtファイルで「スレッド」を探し、一時的に削除します。

私の場合、これにより、欠落しているライブラリ(または、むしろその開発パッケージ)がすぐに特定されました。それをインストールし、debian/controlBuild-Depends:セクションに追加し、再コンパイルして、すべてが機能しました。

0

依存関係を1つインストールしてくださいglibc-static

Ubuntuでは、apt-get install build-essential

他のLinuxでは、glibc-static

0
Aditya Pawaskar