特定のマシンでスムーズに実行されていた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)
次は何をしようかというアイデアがすでに不足しているので、少し助けていただければ幸いです。
編集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-stubsとlibc6-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
_
問題はcmakeの実行中に発生していました。ただし、この場合、cmakeは問題ではなく、エラーは静かであり、-lpthreads関連のエラー/警告のみがcmakeエラーログファイルに書き込まれましたが、それは問題を引き起こしていませんでした。私はcmakelists.txtの最小バージョンを作成し、どのパッケージが停止を引き起こしているのかを見つけるまで、行ごとにテストを開始しました:最終的にバージョンの不一致が見つかりました...
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が見つかりません"がなくなりました
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
で失敗します。代わりに-lpthread
(s
なし)にする必要がありますか?
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
ubuntu 18.04で以下のように解決しました。
$ Sudo apt-get install libboost-all-dev
最小限のCmakelists.txtで同じ出力が得られるというまったく同じ問題がありました。これを解決するには、cmakeを 最新バージョン(私の場合は3.15)にアップグレードするだけです
これは長年のCMakeバグのようです。他の何かがうまくいかず、CMakeが混乱し、実際のエラーの代わりにこの偽の問題を報告します。
CMakeLists.txtファイルで「スレッド」を探し、一時的に削除します。
私の場合、これにより、欠落しているライブラリ(または、むしろその開発パッケージ)がすぐに特定されました。それをインストールし、debian/control
のBuild-Depends:
セクションに追加し、再コンパイルして、すべてが機能しました。
依存関係を1つインストールしてくださいglibc-static
Ubuntuでは、apt-get install build-essential
他のLinuxでは、glibc-static
。