Buongiorno,
facendo degli esercizi per l'università e scrivendoli in C, ho avuto un problema di compilazione di un programma che faceva uso della funzione pow().
Nello specifico, usando la seguente riga:
- gcc -Wall programma.c
ottenevo un errore di undefined reference, pur avendo incluso il file math.h.
Usando g++, invece, questo non accade.
Facendo una rapida ricerca ho scoperto che per farlo compilare devo aggiungere l'opzione -lm, sotto Linux.
Usando MinGW, in ambiente Windows, invece, non ce n'è bisogno.
Qualcuno ha idea della ragione di queste differenze?
Grazie in anticipo.
[RISOLTO] Compilazione con funzioni da libreria libm
[RISOLTO] Compilazione con funzioni da libreria libm
Ultima modifica di _Alex_ il 25/10/2019, 9:47, modificato 1 volta in totale.
Re: Compilazione con funzioni da libreria libm
Diversa implementazione del compilatore e delle librerie che sono collegate di default. Vedi https://en.m.wikipedia.org/wiki/C_mathe ... _functions alla sezione libm (libreria che contiene le funzioni matematiche dichiarate nel file di header chiamato math.h)_Alex_ ha scritto:Buongiorno,
facendo degli esercizi per l'università e scrivendoli in C, ho avuto un problema di compilazione di un programma che faceva uso della funzione pow().
Nello specifico, usando la seguente riga:
- gcc -Wall programma.c
ottenevo un errore di undefined reference, pur avendo incluso il file math.h.
Usando g++, invece, questo non accade.
Facendo una rapida ricerca ho scoperto che per farlo compilare devo aggiungere l'opzione -lm, sotto Linux.
Usando MinGW, in ambiente Windows, invece, non ce n'è bisogno.
Qualcuno ha idea della ragione di queste differenze?
Grazie in anticipo.
L'opzione -lm indica al compilatore gcc di effettuare il linking della libreria libm al file oggetto generato dalla compilazione del codice sorgente in linguaggio C; quest'ultimo al proprio interno contiene il rifermento alla funzione di libreria (ad esempio, pow()) che è fornita dalla libreria libm. In mancanza dell'opzione -lm, il linker (richiamato dal compilatore gcc) non trova nelle librerie standard il riferimento alla funzione pow() , generando il messaggio di errore che hai riferito.
EDIT modifico il titolo da "math.h" a "Compilazione con funzioni da libreria libm"
Re: Compilazione con funzioni da libreria libm
Grazie, quello che mi lascia perplesso è che fino a qualche tempo fa non c'era bisogno di quell'opzione.
Si tratta di ricordi di esercizi di programmazione risalenti a qualche anno fa, ma ci sono rimasto maluccio...
Si tratta di ricordi di esercizi di programmazione risalenti a qualche anno fa, ma ci sono rimasto maluccio...
Re: Compilazione con funzioni da libreria libm
Figurati._Alex_ ha scritto:Grazie, Quello che mi lascia perplesso è che fino a qualche tempo fa non c'era bisogno di quell'opzione. Si tratta di ricordi di esercizi di programmazione risalenti a qualche anno fa, ma ci sono rimasto maluccio...
Comunque, dal changelog del gcc sembrerebbe che la libreria libm non sia più aggiunta di default da lungo tempo:
Codice: Seleziona tutto
$ apt-get source gcc-7
$ cd gcc-7-7.4.0/
$ tar -xOvf gcc-7.4.0-dfsg.tar.xz gcc-7.4.0/ChangeLog | grep -A5 -B5 'libm '
gcc-7.4.0/ChangeLog
Wed Oct 4 11:52:31 1995 Ian Lance Taylor <ian@cygnus.com>
* configure: If CC and CXX are not set in the environment, set
them, based on either an existing Makefile or on searching for gcc
in PATH. Substitute for CC and CXX in Makefile.
* configure.in: Remove libm from target_libs. Separate
target_configdirs from configdirs. If CC is not set in
environment, try to get it from a host Makefile fragment. Rewrite
changes of configdirs to use skipdirs instead. A few minor
tweaks. Take directories out of target_configdirs as they are
taken out of configdirs. Remove existing Makefile files from
La discussione può essere contrassegnata come risolta ?
Re: Compilazione con funzioni da libreria libm
Si, grazie, ci penso io