Debianizzati.Org | Forum | Blog | Guide | IRC
 
 
Forum Italiano Debian - Debianizzati.Org
Novembre 22, 2008, 05:01:16 pm *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Aiuto Ricerca Agenda Accedi Registrati  
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: [C] Riferimento indefinito alla funzione pow()  (Letto 597 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
daniele.87
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 19


Mostra profilo
« inserita:: Aprile 19, 2008, 04:50:43 pm »

Ciao a tutti,
sto utilizzando un makefile per compilare tutta una serie di moduli che serviranno a creare un piccolo progetto C, ma ho un problema:

nel file modulo1.c (uno dei tanti file che compongono il progetto) ho usato la funzione pow(), e quindi  ho incluso la libreria math.h nel file .c, ma questa libreria però in fase di compilazione non viene trovata.
Mi vengono restituiti i seguenti errori:

Codice:
modulo1.c:(.text+0x4c3): undefined reference to `pow'
collect2: ld returned 1 exit status

Sono venuto a sapere che per usare le funzioni matematica a volte bisogna aggiungere l'opzione -lm, però dove vado a scrivere questa opzione??

La prima cosa che ho pensato è di includerla nel makefile, ma in che punto?
Ho provato in un po' di modi ma il problema si ripresenta.

Vi posto il contenuto del file makefile:
Codice:
objects = main.o modulo1.o solver.o clausole.o vettori.o
modulo1: $(objects)
cc -o modulo1 $(objects)
main.o: solver.o modulo1.o clausole.o vettori.o main.c \
letterali.h vettori.h clausole.h solver.h
cc -c main.c
modulo1.o: solver.o vettori.o clausole.o  modulo1.c letterali.h \
vettori.h clausole.h solver.h modulo1.h
cc -c modulo1.c
solver.o: vettori.o clausole.o solver.c
cc -c solver.c
clausole.o: vettori.o clausole.c vettori.h letterali.h clausole.h
cc -c clausole.c
vettori.o: vettori.c vettori.h
cc -c vettori.c

.PHONY: clean
clean:
rm $(objects) modulo1


Cosa posso fare??
Dove includere questa opzione o cos'altro fare?

Grazie
« Ultima modifica: Aprile 19, 2008, 04:52:22 pm da daniele.87 » Registrato
jethro
Jr. Member
**

Karma: +1/-0
Scollegato Scollegato

Messaggi: 50



Mostra profilo
« Risposta #1 inserita:: Aprile 19, 2008, 05:41:37 pm »

l'opzione -lm va usata nel seguente modo:

Codice:
cc -o eseguibile sorgente1.c sorgente2.c eccetera -lm

quindi puoi crearti una variabile option nel makefile

Codice:
option=-lm

e richiamarla dove ti serve  Wink

un makefile semplice
Codice:
SRC=sorgente1.c sorgente2.c eccetera
EXE=eseguibile
OPT=-lm

all:
        cc -o $(EXE) $(SRC) $(OPT)
Registrato
daniele.87
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 19


Mostra profilo
« Risposta #2 inserita:: Aprile 19, 2008, 06:24:54 pm »

Ottimo grazie.
Registrato
daniele.87
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 19


Mostra profilo
« Risposta #3 inserita:: Aprile 19, 2008, 06:39:36 pm »

Scusami, ma questa è la prima volta che uso un makefile (e questo non è neanche il massimo della semplicità per il mio attuale livello) e non capisco bene cosa fare.

Provando a seguire le tue indicazioni ho modificato il file come segue:
Codice:
objects = main.o modulo1.o solver.o clausole.o vettori.o
modulo1: $(objects)
cc -o modulo1 [b]-lm[/b] $(objects)
main.o: solver.o modulo1.o clausole.o vettori.o main.c \
letterali.h vettori.h clausole.h solver.h
cc -c main.c
modulo1.o: solver.o vettori.o clausole.o  modulo1.c letterali.h \
vettori.h clausole.h solver.h modulo1.h
cc -c modulo1.c
solver.o: vettori.o clausole.o solver.c
cc -c solver.c
clausole.o: vettori.o clausole.c vettori.h letterali.h clausole.h
cc -c clausole.c
vettori.o: vettori.c vettori.h
cc -c vettori.c

.PHONY: clean
clean:
rm $(objects) modulo1

E' corretto??
Io dovrei alla fin fine solo usare quell'opzione la quando si va a compilare il file modulo1.c perché solo in quel file uso la libreria math.
Registrato
Finn
Global Moderator
Hero Member
*****

Karma: +30/-6
Scollegato Scollegato

Messaggi: 1195


207002659
Mostra profilo
« Risposta #4 inserita:: Aprile 19, 2008, 08:38:13 pm »

Non quando viene compilato un "blocco" che usa math.h ma quando viene linkato, comunque ad occhio è corretto.
Proprio per farrre i pignoli, puoi semplificarti parecchio la vita evitando di mettere i vari cc -c <X>.c, make è sufficientemente intelligente da farlo per te.
Se hai tempo, una lettura veloce allo "Short contens" di GNU `make'  può aiutare in tal senso.

My 0.02€

PS
Giusto per curiosità, cosa stai facendo? I nomi di file mi ricordano brutte cose Tongue
Registrato
daniele.87
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 19


Mostra profilo
« Risposta #5 inserita:: Aprile 19, 2008, 09:18:36 pm »

Purtroppo all'esecuzione del programma mi viene dato sempre "segmentation fault".
Provando ad eliminare le righe di codice incriminate tutto va a buon fine...

Evidentemente c'è ancora qualcosa che non va...

Per rispondere alla tua domanda sto progettando per l'uni un programma che riconosce se una formula è soddisfacibile o meno.

Registrato
Finn
Global Moderator
Hero Member
*****

Karma: +30/-6
Scollegato Scollegato

Messaggi: 1195


207002659
Mostra profilo
« Risposta #6 inserita:: Aprile 19, 2008, 10:54:29 pm »

Allora ho riconosciuto davvero qualcosa di brutto (almeno in linea di principio... SAT non mi sembra un problemino da niente...).

Se da segmentation fault è un problema di codice, non di Makefile.

Se vuoi ci si da un occhio, in privato se preferisci.

My 0.02€
Registrato
daniele.87
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 19


Mostra profilo
« Risposta #7 inserita:: Aprile 20, 2008, 10:07:42 am »

Ok, grazie.
Registrato
daniele.87
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 19


Mostra profilo
« Risposta #8 inserita:: Aprile 20, 2008, 04:09:03 pm »

La cosa assurda è che ho provato a sostituire la funzione pow con una mia funzione ricorsiva che fa la stessa cosa, e...no ho risulto nulla...

da esattamente lo stesso errore di prima...assurdo...
Registrato
jethro
Jr. Member
**

Karma: +1/-0
Scollegato Scollegato

Messaggi: 50



Mostra profilo
« Risposta #9 inserita:: Aprile 20, 2008, 05:51:48 pm »

da esterno mi viene da chiederti

"hai controllato i puntatori che usi e che non puntino a zone di memoria non allocata?"

oppure

hai provato a usare un debugger (gdb) oppure le comunissime printf per localizzare facilmente l'errore?

scusa se ti sembrano cose banali e se hai già controllato tutto, ma volte basta un niente è sei fregato    Smiley
Registrato
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Altri Topic Correlati
Oggetto Aperta da Risposte Visite Ultimo messaggio
Streamtuner, funzione: record Multimedia kappe 0 194 Ultimo messaggio Febbraio 02, 2006, 10:27:40 am
da kappe
raiclick e funzione seek Multimedia fraborgh 4 593 Ultimo messaggio Gennaio 30, 2007, 01:38:16 am
da fraborgh
Tasti Funzione Asus F3tc - ap001c Laptop Arun 2 358 Ultimo messaggio Maggio 23, 2007, 08:40:25 pm
da revjones
Tasti Funzione Sony-Vaio! Hardware spaghetto 3 904 Ultimo messaggio Ottobre 11, 2007, 12:17:17 pm
da Il Tera
[C] Una domanda su una funzione ricorsiva Programmazione daniele.87 1 311 Ultimo messaggio Aprile 23, 2008, 07:29:40 pm
da Finn
Powered by MySQL Powered by PHP Powered by SMF 1.1.7 | SMF © 2006-2008, Simple Machines LLC XHTML 1.0 valido! CSS valido!
Pagina creata in 0.093 secondi con 20 interrogazioni al database.