 
View Full Version : [C] Help cannot find -lmsg
Kodert89
28-06-2010, 19:40
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:
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
Ora l'errore pare essere il -lmsg l'opzione del gcc. 
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.
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.
Kodert89
30-06-2010, 09: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.
-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).
Kodert89
30-06-2010, 14:37
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!
quindi il problema è nel codice e non nel fatto che mi manca una libreria nel sistema.
Esatto, sempre che quella libreria venga creata dal codice, ed io questo non lo so perché non ho visto il Makefile.
Kodert89
01-07-2010, 09:53
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.
#################################################
#
# 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"
Manca chiaramente la generazione della libreria ;)
LIBNAME = libmsg.a
Kodert89
01-07-2010, 20:28
Scusa la domanda forse sciocca ma come faccio a dirgli di generarla? 
Questo 
lib:  $(OBJS)
	-rm  -f $(LIBDIR)/$(LIBNAME)
	ar -r $(LIBNAME) $(OBJS)
	cp $(LIBNAME) $(LIBDIR)
non la genera ? lib viene richiamato dopo msgserv e msgcli , forse deve essere richiamato prima senno non trova la libreria.
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"
Sì, viene creata lì, ma non mi sembra ci sia la dipendenza lib nelle regole in cui si usa -lmsg
Kodert89
02-07-2010, 10:28
Cioè ti puoi spiegare meglio ? 
Non credo di aver capito .
Non so se è importante ma prima nel msgservr cera una bara così:
msgserv: msgserv.o comsock.o /
	$(CC) -o $@ $^ $(LIBS) -lmsg -lpthread
Siccome non mi girava l'ho tolta , anche perchè non so cosa significa una barra messa li.
Comunque può darsi che quello che manca celo devo inserire io .
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 ;) Che ovviamente ci va messa.
Kodert89
03-07-2010, 11:29
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
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.