|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Mar 2008
Messaggi: 22
|
[C] Help cannot find -lmsg
Salve ,
sto facendo un progetto per l'università e ho scritto del codice in c , ci hanno dato un makefile dove aggiungere solo le parte necessarie a far compilare in nostro progetto ma lanciando il make mi da un errore: Codice:
gcc -o msgserv msgserv.o comsock.o genList.o genHash.o gthread.o -L ../lib -lmsg -lpthread /usr/bin/ld: cannot find -lmsg collect2: ld returned 1 exit status make: *** [msgserv] Error 1 Purtroppo non ho la minima idea di che cosa sia quell'opzione. Naturalmente sto facendo girare tutto su linux (debian squeeze 64bit). Se qualcuno potesse illuminarmi su quale sia il problema , ne sarei grato. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Vuole linkare una fantomatica libreria libmsg.so, che sinceramente non trovo tra le librerie presenti nei repository. Probabilmente viene creata dal tuo progetto.
Posta il makefile. |
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Mar 2008
Messaggi: 22
|
Non so come ma si è risolto da solo , ho provato levando l'opzione e mi è partito , qundo la ho rimessa non ha dato problemi .
Ma praticamente con -lmsg andrebbe a cercare la libreria msg ? come funzionerebbe il comando , tanto per capire. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
-lnome (-l seguito dal nome della libreria) va a cercare di caricare la libreria (statica o dinamica, dipende dalle opzioni passate) che ha come nome libnome.a (statica) o libnome.so (dinamica).
|
|
|
|
|
|
#5 |
|
Junior Member
Iscritto dal: Mar 2008
Messaggi: 22
|
Quindi se non la trova nella cartella che gli passo io la va a cercare in /usr/bin/ld e non trovandola mi ritorna errore , quindi il problema è nel codice e non nel fatto che mi manca una libreria nel sistema.
Grazie dell'aiuto! |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
|
|
|
|
|
#7 |
|
Junior Member
Iscritto dal: Mar 2008
Messaggi: 22
|
Premetto che è da poco che metto mano su un makefile e quindi ho poca esperienza .
Comunque , dove c'è scritto da completare lo ho aggiunto io , apparte nel primo frammento che non dovevo aggiungere nulla perchè usavo solo i suoi file, se ti servono altre info riguardo ai file a cui fa riferimento dimmelo perchè ci metterei una vita a spiegarteli tutti , comunque il problema è solo lanciando il test3.. perchè gli server msgserv e msgcli che usano quella libreria. Codice:
################################################# # # Makefile progetto lso 2010 # (fram 1)(fram 2)(fram 3) ################################################# # ***** DA COMPLETARE ****** con i file da consegnare # primo frammento FILE_DA_CONSEGNARE1=./genList.c ./genHash.c # secondo frammento FILE_DA_CONSEGNARE2=./logpro # terzo frammento FILE_DA_CONSEGNARE3=./msgserv.c ./msgcli.c ./Makefile ./logpro ./genList.c ./genHash.c ./genHash.h ./comsock.c # Compiler flags CFLAGS = -Wall -pedantic -g # aggiungere -lgcov o -fprofile-arcs al linking # Compilatore CC = gcc # Librerie LIBDIR = ../lib LIBS = -L $(LIBDIR) # Nome libreria LIBNAME = libmsg.a # Lista degli object files (** DA COMPLETARE ***) OBJS = genList.o genHash.o comsock.o # nomi eseguibili test primo frammento exe1 = msg_test1 exe2 = msg_test2 # phony targets .PHONY: clean lib test11 test12 docu consegna1 .PHONY: test21 consegna2 .PHONY: test31 test32 test33 consegna3 # creazione libreria lib: $(OBJS) -rm -f $(LIBDIR)/$(LIBNAME) ar -r $(LIBNAME) $(OBJS) cp $(LIBNAME) $(LIBDIR) # eseguibile di test 1 (primo frammento) $(exe1): genList.o test-genList.o $(CC) -o $@ $^ # eseguibile di test 2 (primo frammento) $(exe2): $(OBJS) test-genHash.o $(CC) -o $@ $^ # dipendenze oggetto main di test 11 test-genList.o: test-genList.c genList.h $(CC) $(CFLAGS) -c $< # dipendenze oggetto main di test 12 test-genHash.o: test-genHash.c genHash.h genList.h $(CC) $(CFLAGS) -c $< # make rule per gli altri .o del primo frammento (***DA COMPLETARE***) msgserv: msgserv.o comsock.o genHash.o genList.o $(CC) -o $@ $^ $(LIBS) -lmsg -lpthread msgcli: msgcli.o comsock.o $(CC) -o $@ $^ $(LIBS) -lmsg -lpthread # make rule per i .o del terzo frammento (***DA COMPLETARE***) msgserv.o: msgserv.c genHash.h genList.h comsock.h $(CC) $(CFLAGS) -c $< msgcli.o: msgcli.c genHash.h genList.h $(CC) $(CFLAGS) -c $< ########### NON MODIFICARE DA QUA IN POI ################ # genera la documentazione con doxygen docu: ../doc/Doxyfile make -C ../doc #ripulisce clean: -rm -f *.o *.~ # primo test primo frammento test11: make clean make $(exe1) echo MALLOC_TRACE e\' $(MALLOC_TRACE) @echo MALLOC_TRACE deve essere settata a \"./.mtrace\" -rm -f ./.mtrace ./$(exe1) mtrace ./$(exe1) ./.mtrace @echo -e "\a\n\t\t *** Test 1-1 superato! ***\n" # secondo test primo frammento test12: make clean make $(exe2) echo MALLOC_TRACE e\' $(MALLOC_TRACE) @echo MALLOC_TRACE deve essere settata a \"./.mtrace\" -rm -f ./.mtrace ./$(exe2) mtrace ./$(exe2) ./.mtrace @echo -e "\a\n\t\t *** Test 1-2 superato! ***\n" # test secondo frammento test21: cp DATA/logtest.* . chmod 644 ./logtest.* ./logpro ./logtest.dat > ./outtest diff ./outtest ./logtest.check @echo -e "\a\n\t\t *** Test 2-1 superato! ***\n" # primo test terzo frammento test31: msgserv msgcli lib -killall -w msgserv -killall -w msgcli cp DATA/userlist . cp DATA/userlist2 . cp DATA/out31.check . chmod 644 userlist userlist2 out31.check -rm -fr tmp/ -mkdir tmp ./testparse 2>.err diff ./out31 ./out31.check @echo -e "\a\n\t\t *** Test finale 3-1 superato! ***\n" # secondo test terzo frammento test32: msgserv msgcli lib -killall -w msgserv -killall -w msgcli cp DATA/userlist . cp DATA/outcli?.check . chmod 644 ./userlist chmod 644 ./outcli?.check -rm -fr tmp/ -mkdir tmp ./testfunz diff ./outcli1 ./outcli1.check diff ./outcli2 ./outcli2.check diff ./outcli3 ./outcli3.check @echo -e "\a\n\t\t *** Test finale 3-2 superato! ***\n" # terzo test terzo frammento test33: msgserv msgcli lib -killall -w msgserv -killall -w msgcli cp DATA/userlist . cp DATA/logsort.check . chmod 644 userlist chmod 644 logsort.check -rm -fr tmp/ -mkdir tmp ./testpar @echo -e "\a\n\t\t *** Test finale 3-3 superato! ***\n" # target di consegna primo frammento SUBJECT1="lso10: consegna primo frammento" consegna1: make test11 make test12 ./gruppo-check.pl < gruppo.txt tar -cvf $(USER)-f1.tar ./gruppo.txt ./Makefile $(FILE_DA_CONSEGNARE1) @echo -e "\a\n\t\t *** Frammento 1 consegnato ***\n" # target di consegna secondo frammento SUBJECT2="lso10: consegna secondo frammento" consegna2: make test21 ./gruppo-check.pl < gruppo.txt tar -cvf $(USER)-f2.tar ./gruppo.txt $(FILE_DA_CONSEGNARE2) @echo -e "\a\n\t\t *** Frammento 2 consegnato ***\n" # target di consegna terzo frammento SUBJECT3="lso10: consegna terzo frammento" consegna3: make test11 make test12 make test21 make test31 make test32 make test33 ./gruppo-check.pl < gruppo.txt tar -cvf $(USER)-f3.tar ./gruppo.txt $(FILE_DA_CONSEGNARE3) @echo -e "\a\n\t\t *** Progetto finale consegnato ***\n" Ultima modifica di Kodert89 : 01-07-2010 alle 09:55. |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Manca chiaramente la generazione della libreria
LIBNAME = libmsg.a |
|
|
|
|
|
#9 |
|
Junior Member
Iscritto dal: Mar 2008
Messaggi: 22
|
Scusa la domanda forse sciocca ma come faccio a dirgli di generarla?
Questo Codice:
lib: $(OBJS) -rm -f $(LIBDIR)/$(LIBNAME) ar -r $(LIBNAME) $(OBJS) cp $(LIBNAME) $(LIBDIR) Codice:
test31: msgserv msgcli lib -killall -w msgserv -killall -w msgcli cp DATA/userlist . cp DATA/userlist2 . cp DATA/out31.check . chmod 644 userlist userlist2 out31.check -rm -fr tmp/ -mkdir tmp ./testparse 2>.err diff ./out31 ./out31.check @echo -e "\a\n\t\t *** Test finale 3-1 superato! ***\n" |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Sì, viene creata lì, ma non mi sembra ci sia la dipendenza lib nelle regole in cui si usa -lmsg
|
|
|
|
|
|
#11 |
|
Junior Member
Iscritto dal: Mar 2008
Messaggi: 22
|
Cioè ti puoi spiegare meglio ?
Non credo di aver capito . Non so se è importante ma prima nel msgservr cera una bara così: Codice:
msgserv: msgserv.o comsock.o / $(CC) -o $@ $^ $(LIBS) -lmsg -lpthread Comunque può darsi che quello che manca celo devo inserire io . |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
lib è una regola del makefile... Ci siamo ?
msgserv è un'altra regola. Se una regola dipende da un'altra solitamente si fa in modo di eseguire quella regola prima della regola dipendente. msgserv: msgserv.o comsock.o Quelle in grassetto sono dipendenze, ma come vedi non c'è la dipendenza lib |
|
|
|
|
|
#13 |
|
Junior Member
Iscritto dal: Mar 2008
Messaggi: 22
|
Quindi se metto
msgserv: msgserv.o comsock.o lib non dovrebbe più darmi problemi. Ma la \ che cosa significa se messa nella riga delle dipendenze (nell'altro posto avevo sbagliato barra), mi dava problemi nel compilare dicendomi che mi mancavano delle dipendenze . E un altra cosa perchè scrivere che msgserv dipende da msgserv.o e comsock.o quando nelle dipendenza di msgserv.o c'è già comsock.h . Se metto msgserv: msgserv.o comsock.o allora devo mettere anche genList.o genHash.o |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:18.




















