【问题标题】:undefined reference to symbol 'pthread_key_delete@@GLIBC_2.2.5对符号'pthread_key_delete@@GLIBC_2.2.5 的未定义引用
【发布时间】:2014-10-26 09:23:07
【问题描述】:

我正在尝试在 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 的答案。

标签: linux linker-errors undefined-reference


【解决方案1】:

上面的链接问题通过添加解决

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

【讨论】:

  • 为我解决了这个问题,在我无法控制环境的集群上编译开源项目。干杯。
  • 这只是部分正确。如果 GCC 无法正确链接它,它可能也在没有线程安全的静态局部变量的情况下对其进行了编译。在编译器和链接器命令行上添加 -pthread 应该可以解决问题。
【解决方案2】:

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

【讨论】:

  • 这更像是一个跨平台的适当答案。在 Mac 和 Linux 上编译有不同的要求,这可以防止任何丑陋的 if (APPLE) 东西。
【解决方案3】:

如果您使用 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})

【讨论】:

    猜你喜欢
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 2013-04-21
    • 2014-07-11
    • 1970-01-01
    • 2020-11-19
    相关资源
    最近更新 更多