Modifica1:
Tutti i riferimenti seguenti sono per Ubuntu.
Pacchetto denominato libpthread-stubs0
è probabilmente solo uno stub, quindi non avrà il pthread_create
funzione.
Ce l'hai?
$ find /lib -name "*pthread*"
/lib/x86_64-linux-gnu/libpthread-2.15.so
/lib/x86_64-linux-gnu/libpthread.so.0
Controlla il simbolo pthread_create
che dovrebbe esistere.
$ nm /lib/x86_64-linux-gnu/libpthread.so.0 | grep "pthread_create"
0000000000008140 t __pthread_create_2_1
0000000000008140 T [email protected]@GLIBC_2.2.5
Se non funziona, potresti aver bisogno della versione dev di pthread
che è in libc6-dev
. Puoi cercare il contenuto del pacchetto che ha libpthread.so
in http://packages.ubuntu.com/.
Nota:inoltre, fallisce su -lpthreads
. Dovrebbe essere -lpthread
invece (senza s
)?
Modifica 2
Crea un semplice CMakeLists.txt
con quanto segue ed esegui cmake
.
cmake_minimum_required (VERSION 2.8.7)
find_package(Threads)
Qual è l'output? Trova pthread
?
Il mio output è:
-- Looking for include file pthread.h
-- Looking for include file pthread.h - found
-- Looking for pthread_create
-- Looking for pthread_create - not found.
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE
Il problema si verificava durante l'esecuzione di cmake. Tuttavia, in questo caso cmake non era il problema, l'errore era silenzioso e l'errore/avviso relativo a -lpthreads era l'unica cosa scritta nel file di registro degli errori di cmake, sebbene ciò non causasse alcun problema. Ho fatto una versione minima di cmakelists.txt e ho iniziato a testarlo riga per riga finché non ho scoperto quale pacchetto ne causava l'arresto:alla fine ho scoperto che si trattava di una mancata corrispondenza di versione...
Suggerimento:cerca il messaggio di errore effettivo
In genere cerchi l'ultimo messaggio di errore. Tuttavia, questa strategia (spesso utile) in questi casi porta fuori strada.
Quello che stai guardando è il CMakeCache.txt
, il CMakeOutput.log
o il CMakeError.log
. Come mai? Quando alcune delle macro o dei test nella fase di configurazione falliscono, CMake scarica "utilmente" questi file nell'output. Sfortunatamente, questi file possono essere lunghi migliaia di righe e in genere contengono molti "*** Error: xyz"
voci, per vari controlli di configurazione. Quello per "-lpthreads
" casualmente era l'ultimo nel registro...
Soluzione :esamina il registro dall'alto , identifica la sezione con i controlli di configurazione, trova l'ultimo controllo di configurazione prima del punto in cui CMake identifica l'errore e scarica i suoi registri. Potresti anche provare a cercare il testo "Configuring incomplete, errors occurred!
"
In genere troverai un messaggio di errore effettivo molto preciso lì, o almeno trovi il nome/percorso della macro o della funzione chiamata per ultima, e questo ti consente di individuare ciò che effettivamente è andato storto.
su Ubuntu 18.04.1 LTS questa installazione mi ha fornito tutti i file necessari:
apt -y install libboost-tools-dev libboost-thread1.62-dev magics++
/usr/lib/x86_64-linux-gnu/libpthread.a
/usr/lib/x86_64-linux-gnu/libpthread.so
/usr/lib/x86_64-linux-gnu/libpthread_nonshared.a
niente più errori "/usr/bin/ld:impossibile trovare -lpthreads" dopo