未定义的符号引用' pthread_key_delete @@ GLIBC_2.2.5

时间:2014-09-02 07:17:17

标签: linux linker-errors undefined-reference

我正在尝试在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并将'-L / lib64 -l pthread'添加到变量LDFLAGS但是你怎么做的?这里完全是linux新手= X

3 个答案:

答案 0 :(得分:18)

通过添加

解决了上述链接问题
-lpthread -lm to CMakeLists.txt (target link libraries for luxrender);
TARGET_LINK_LIBRARIES(... -lpthread -lm)

答案 1 :(得分:7)

我遇到了同样的问题:-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中为您正在构建的项目搜索“thread”并粘贴这些部分(或链接您尝试构建的项目,如果它是开源的) - 如果以上是'自我解释

答案 2 :(得分:0)

如果要使用Make或其他工具进行构建,请将-pthread添加到编译命令行(这样,GCC就会生成线程安全的静态本地变量)和链接命令行(这样,GCC就会告诉链接器执行此操作)正确的方法,最明显的是与-lpthread链接。

如果要使用CMake进行构建-那么很可能需要这些(full example):

# always
FIND_PACKAGE(Threads REQUIRED)

# if using boost
SET(Boost_USE_MULTITHREADED ON)

TARGET_LINK_LIBRARIES(my_app ... ${CMAKE_THREAD_LIBS_INIT})