PDA

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.

cionci
29-06-2010, 08:30
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.

cionci
30-06-2010, 09:26
-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!

cionci
30-06-2010, 15:31
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"

cionci
01-07-2010, 10:00
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"

cionci
01-07-2010, 20:36
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 .

cionci
02-07-2010, 10:45
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