web-dev-qa-db-ja.com

シンボル 'pthread_key_delete @@ GLIBC_2.2.5への未定義の参照

Ubuntuでファイルを作成しようとしていますが、作成するとこのエラーが発生し続けます:

/usr/bin/ld: ../../gtest-1.7.0/libgtest.a(gtest-all.cc.o): undefined reference to symbol     'pthread_key_delete@@GLIBC_2.2.5'
/lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make[2]: *** [src/tests/run_tests] Error 1
make[1]: *** [src/tests/CMakeFiles/run_tests.dir/all] Error 2
make: *** [all] Error 2

私は誰かがMakefileに入り、変数LDFLAGSに「-L/lib64 -l pthread」を追加することについて言及しているのを見ましたが、どうやってそれを行うのですか?ここでLinuxにまったく新しい= X

18
imolital

上記のリンクの問題は、

-lpthread -lm to CMakeLists.txt (target link libraries for luxrender);
TARGET_LINK_LIBRARIES(... -lpthread -lm)
21
user4587644

私は同じ問題に遭遇しました:-lpthreadはリンク呼び出しの最後になければなりません(静的シンボルと共有シンボルの混合に関係しています)

CMakeの場合:${CMAKE_THREAD_LIBS_INIT}は最後でなければなりません。例えば:

target_link_libraries(mytestlib
  ${BINARY_DIR}/libgmock.a
  glog
  gflags
  ${Boost_LIBRARIES}
  ${CMAKE_THREAD_LIBS_INIT}
)

そしてOPの場合:ビルドしているプロジェクトのCMakeLists.txtで「スレッド」を検索し、それらのセクション(またはオープンソースの場合はビルドしようとしているプロジェクトへのリンク)を貼り付けます-上記が自明ではない場合

7

Makeなどでビルドしている場合は、-pthreadをコンパイルコマンドライン(GCCがスレッドセーフな静的ローカルを生成する)とリンクコマンドライン(GCCがリンカーに正しいことを行うように指示する)に追加します。 、特に-lpthread)とリンクします。

CMakeを使用してビルドしている場合は、おそらくこれらが必要です( 完全な例 ):

# always
FIND_PACKAGE(Threads REQUIRED)

# if using boost
SET(Boost_USE_MULTITHREADED ON)

TARGET_LINK_LIBRARIES(my_app ... ${CMAKE_THREAD_LIBS_INIT})
2
bobah