我正在尝试在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
答案 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})