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

24

我正在尝试在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


我看到了相同的问题,并希望得到一个面向CMake的答案。 - Elaine Hale
3个回答

24
上述的链接问题可以通过添加解决。
-lpthread -lm to CMakeLists.txt (target link libraries for luxrender);
TARGET_LINK_LIBRARIES(... -lpthread -lm)

问题已经为我解决了,在一个我无法控制环境的集群上编译开源项目。干杯! - domini1000
这只是部分正确的。如果GCC无法正确链接它,那么它可能也会在没有线程安全静态本地变量的情况下编译它。在编译器和链接器命令行上都添加“-pthread”应该可以解决问题。 - bobah

13

我遇到了同样的问题:-lpthread应该在您的链接调用中最后出现(与静态和共享符号的混合有关)

所以使用CMake: ${CMAKE_THREAD_LIBS_INIT} 应该放在最后。例如:

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

针对楼主:在您要构建的项目的CMakeLists.txt文件中搜索“thread”并粘贴这些部分(或链接到您正在尝试构建的项目,如果它是开源的) - 如果上述内容不够清晰明了。


1
这更像是一个跨平台适用的答案。在Mac和Linux上编译有不同的要求,这可以避免任何丑陋的 if (APPLE) 代码。 - David

4
如果您正在使用Make或其他工具进行构建,请在编译命令行中添加-pthread(这样GCC将生成线程安全的静态局部变量),并在链接命令行中添加-lpthread(这样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})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接