J'essaie de créer un fichier dans Ubuntu et quand je fais, je continue à avoir cette erreur:
/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
J'ai vu quelqu'un mentionner d'aller dans Makefile et d'ajouter '-L/lib64 -l pthread' à la variable LDFLAGS mais comment procédez-vous? Totalement nouveau sur Linux ici = X
Le problème de liaison ci-dessus est résolu en ajoutant
-lpthread -lm to CMakeLists.txt (target link libraries for luxrender);
TARGET_LINK_LIBRARIES(... -lpthread -lm)
Je pose le même problème: -Lpthread devrait être le dernier dans votre invocation de lien (Concerne le mélange de symboles statiques et partagés)
Donc avec CMake: ${CMAKE_THREAD_LIBS_INIT}
devrait être le dernier. Par exemple:
target_link_libraries(mytestlib
${BINARY_DIR}/libgmock.a
glog
gflags
${Boost_LIBRARIES}
${CMAKE_THREAD_LIBS_INIT}
)
Et pour l'OP: Recherchez "thread" dans le fichier CMakeLists.txt pour le projet que vous construisez et collez cette section (ou le lien du projet que vous essayez de construire s'il est open source) - si ce qui précède n'est pas évident
Si vous construisez avec Make ou quelque chose d'autre, ajoutez -pthread
à la ligne de commande de compilation (pour que GCC génère des locals statiques thread-safe) et à la ligne de commande de liaison (afin que GCC indique à l'éditeur de liens qu'il doit faire la bonne chose, notamment link avec -lpthread
).
Si vous construisez avec CMake - alors vous aurez probablement besoin de ces informations ( exemple complet ):
# always
FIND_PACKAGE(Threads REQUIRED)
# if using boost
SET(Boost_USE_MULTITHREADED ON)
TARGET_LINK_LIBRARIES(my_app ... ${CMAKE_THREAD_LIBS_INIT})