[RISOLTO] Compilazione con funzioni da libreria libm

C, C++, Java, ...

[RISOLTO] Compilazione con funzioni da libreria libm

Messaggioda _Alex_ » 23/10/2019, 7:51

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.
Ultima modifica di _Alex_ il 25/10/2019, 9:47, modificato 1 volta in totale.
_Alex_
Jr. Member
Jr. Member
 
Messaggi: 90
Iscritto il: 02/09/2017, 8:32
Località: Genova

Re: Compilazione con funzioni da libreria libm

Messaggioda Aki » 23/10/2019, 23:16

_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.

Diversa implementazione del compilatore e delle librerie che sono collegate di default. Vedi https://en.m.wikipedia.org/wiki/C_mathematical_functions alla sezione libm (libreria che contiene le funzioni matematiche dichiarate nel file di header chiamato math.h)

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"
Aki
Global Moderator
Global Moderator
 
Messaggi: 8772
Iscritto il: 27/12/2007, 16:59

Re: Compilazione con funzioni da libreria libm

Messaggioda _Alex_ » 24/10/2019, 14:25

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...
_Alex_
Jr. Member
Jr. Member
 
Messaggi: 90
Iscritto il: 02/09/2017, 8:32
Località: Genova

Re: Compilazione con funzioni da libreria libm

Messaggioda Aki » 24/10/2019, 21:24

_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...

Figurati.

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

Non vorrei sbagliarmi, ma dal changelog sopra indicato, sembrerebbe che la libreria libm è stata rimossa dalle librerie di default del gcc (per Linux) dal 1995.

La discussione può essere contrassegnata come risolta ?
Aki
Global Moderator
Global Moderator
 
Messaggi: 8772
Iscritto il: 27/12/2007, 16:59

Re: Compilazione con funzioni da libreria libm

Messaggioda _Alex_ » 25/10/2019, 9:47

Si, grazie, ci penso io
_Alex_
Jr. Member
Jr. Member
 
Messaggi: 90
Iscritto il: 02/09/2017, 8:32
Località: Genova


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite