PDA

View Full Version : [C/C++] Compilazione Thread POSIX


aleksay
28-04-2009, 14:37
Salve a tutti,
Da un po di tempo mi e venuto il pallino di imparare la programmazione con i thread in C.
googlando ho visto che bisogna inserire tra le opzioni di gcc l'opzione -lpthread ma quando lo lancio l'output e questo:

gcc -o threadProve threadProve.c –lpthread
gcc: –lpthread: No such file or directory
make: *** [threadProve] Error 1


premetto che il sorgente in questione e il classico esempio di utilizzo di thread sincronizzati tramite pthread_mutex_* e nient'altro.
Anche provando ad installare altre librerie messe a disposizione dalla mia distro (debian lenny)
non son riuscito a risolvere...
Grassie in anticipo per ogni suggerimento

BrutPitt
28-04-2009, 17:32
libpthread.a fa parte del pacchetto glibc, ma dovresti averlo gia' installato se non hai errori in compilazione e trova "pthread.h".
(a meno che non hai installato solo i glibc-headers)

Prova a fare un whereis libpthread da command line, per vedere se e' localizzato sulla tua macchina... se cosi' fosse prova a specificare il percorso di dove e' ubicato il file, al compilatore, con l'opzione -Lpercorso.

aleksay
28-04-2009, 17:51
uoo grazie per la risposta!! stavo quasi per disperare

il comando mi da due coppie di di percorsi anzi te lo posto

/usr/lib/libpthread.a
/usr/lib/libpthread.so
/usr/lib64/libpthread.a
/usr/lib64/libpthread.so

adesso provo

aleksay
28-04-2009, 17:56
questo e il risultato di quattro tentativi consecutivi....non essendo molto sicuro della sintassi...

ale@debian:~/Desktop/sosr/src$ make threadProve
gcc -o threadProve threadProve.c –lpthread -L /usr/lib/libpthread.so
gcc: –lpthread: No such file or directory
make: *** [threadProve] Error 1
ale@debian:~/Desktop/sosr/src$ make threadProve
gcc -o threadProve threadProve.c –lpthread -L /usr/lib
gcc: –lpthread: No such file or directory
make: *** [threadProve] Error 1
ale@debian:~/Desktop/sosr/src$ make threadProve
gcc -o threadProve threadProve.c –lpthread -L/usr/lib
gcc: –lpthread: No such file or directory
make: *** [threadProve] Error 1
ale@debian:~/Desktop/sosr/src$ make threadProve
gcc -o threadProve threadProve.c –lpthread -L/usr/lib/libpthread.so
gcc: –lpthread: No such file or directory
make: *** [threadProve] Error 1

come vedi...niente..forse va specificato prima il path della libreria???

BrutPitt
28-04-2009, 19:21
Visto che hai ubuntu a 64bit per default compila a 64bit... per cui la sintassi e':

gcc -o threadProve threadProve.c –lpthread -L/usr/lib64

Se vuoi compilare a 32bit devi specificare l'opzione -m32.

gcc -m32 -o threadProve threadProve.c –lpthread -L/usr/lib

aleksay
28-04-2009, 20:21
avevo gia provato ma niente continua a "non trovare" il file -lpthread
ti posto ancora l'output della console per chiarezza:

ale@debian:~/Desktop/sosr/src$ make threadProve
gcc -o threadProve threadProve.c –lpthread -L/usr/lib64
gcc: –lpthread: No such file or directory
make: *** [threadProve] Error 1

e cmq lib64 non dovrebbe essere solo un link alla cartella /usr/lib???
P.S. ...io non uso ubuntu...la mia e una debian dura e pura :D

BrutPitt
28-04-2009, 23:19
E perche' ho immaginato che avessi ubuntu? ... :eek:
Nemmeno io ho ubuntu... e nemmeno una debian... :)

Comunque poco dovrebbe cambiare.

Puo' essere un symbolic link, al limite verifica... ;) ... ma da qui non sapendolo ti avevo fatto specificare /usr/lib64

Qui da me, su Fedora, /usr/lib64 contiene le libraries a 64bit e /usr/lib quelle a 32bit, nessun symbolic link... ma alcune distribuzioni usano /usr/lib32 per le lib a 32bit e /usr/lib come simbolic link per puntare alla directory di default.

Ho appena provato a compilare un mio programma da command line, con entrambi i comandi che ho postato... e non ho problemi sia a 32 che a 64 bit.

Prova ad aggiungere l'opzione -Wl,-verbose: non risolve il problema ma dice al linker di essere "prolisso"... e nell'output si possono controllare i percorsi di ricerca delle libraries che cerca, dove le cerca, e che usa.

Insomma una cosa del genere:
gcc -Wl,-verbose -o threadProve threadProve.c –lpthread -L/usr/lib64

P.S.
L'output e' lungo... per cui al limite ridirigi su file... anche se l'output dei percorsi di ricerca e' solo l'ultima parte.
Se poi vuoi postare, posta solo quella.

BrutPitt
28-04-2009, 23:37
Scusa... ci sto facendo caso solo adesso... mi aspetterei un messaggiod del linker tipo:
/usr/bin/ld: cannot find -lpthread

Un messaggio del tipo:
gcc: –lpthread: No such file or directory

mi sembra piu' come se gcc cercasse -lpthread, come file da compilare... e "ovviamente" non lo trovasse.

Che versionde di gcc hai?
gcc -v

Stai usando sempre il makefile?
Prova da linea di comando... al limite.

aleksay
29-04-2009, 13:39
ok allora la versione di gcc e la 4.3.2-1.1
il comando gcc -v tra le altre cose mi fa vedere anche le opzioni con cui e configurato, tra queste ho notato l'opzione "--enable-threads=posix" il che mi sembra confortante...
per quanto riguarda l'uso del makefile non ho visto nessuna differenza anche perche e mooolto semplice contiene solo il target e il comando gcc senza variabili ne condizioni...e adesso la cosa piu divertente: l'opzione verbose non mi dice assolutamente niente!!!!! o cmq niente di piu..ti incollo per credere:

ale@debian:~/Desktop/sosr/src$ gcc -Wl,-verbose -o threadProve threadProve.c –lpthread -L/usr/lib64
gcc: –lpthread: No such file or directory
ale@debian:~/Desktop/sosr/src$

sembra che questo sia tutto...
a gia..riguardo alle librerie...essendo che ho "rubacchiato" un testo di un progetto scolastico non dovrebbe proprio cambiare niente se si compila a 32 o a 64...anche perche si tratta proprio solo di utilizzare lo standard posix

BrutPitt
29-04-2009, 14:09
E' come pensavo... -Wl,-verbose e' un'opzione da passare al linker, ma al linker non c'arriva proprio... sta cercando -lpthread come file da compilare.

Prova a spostare le opzioni, secondo le direttive dell'help:
gcc -Wl,-verbose –lpthread -L/usr/lib64 -o threadProve threadProve.c

Oppure prova a compilare solo con -c... e poi linkare con ld.

Anche se anche io ho la 4.3.2-7... e compila senza una grinza.

BrutPitt
29-04-2009, 14:14
O ancora meglio... passi direttamente al linker le direttive:

gcc -Wl,-verbose,–lpthread,-L/usr/lib64 -o threadProve threadProve.c

o senza l'opzione -verbose:

gcc -Wl,–lpthread,-L/usr/lib64 -o threadProve threadProve.c

aleksay
29-04-2009, 14:30
guarda...io non so che dire...piu uso il C per programmare e piu mi convinco che gcc in realta non sia un programma ma un bambino capriccioso e lunatico!!!! davvero non ha motivo!!

ho provato adesso a fare come mi dicevi tu ad invertire le opzioni e niente sempre lo stesso risultato...
allora mi son collegato in remoto al server della scuola che usa gcc 3.4.1 (architettura Sun Sparc qualcosaltro) faccio un paio di tentativi sempre lo stesso risultato...provo un ultima volta e..tadaaa...me lha compilato!!!!
al che gia rassegnato a dover sviluppare tutto su vi in remoto (che equivale al suicidio....)
faccio un ultimo tentativo in locale e...tadaaa!!! ha funzionato!!! ....
Si ok son contento di esserci riuscito...ma non ha senso!!!!

Secondo te puo esistere una motivazione logica a tutto cio???

Missionario86
10-02-2011, 21:03
Credo che ormai, dopo quasi 2 anni, a chi ha postato la domanda, questa risposta non sarà più utile, ma spero che sia utile a qualcun'altro, che come me è appena incappato in questo problemino.

Mi spiego, quando si lancia dalla shell il comando, si deve fare attenzione al "-" che si trova davanti a lpthread. Se si guarda bene è diverso da quello scritto davanti al "-o", è più lungo rispetto ai precendenti. Questo è solo un banale problema di copia/incolla. Basta cancellarlo e mettere il trattino normale e il problema scompare.

Un saluto a tutti