[RISOLTO] Compilazione con funzioni da libreria libm

C, C++, Java, ...
Rispondi
_Alex_
Full Member
Full Member
Messaggi: 154
Iscritto il: 02/09/2017, 8:32
Località: Genova

[RISOLTO] Compilazione con funzioni da libreria libm

Messaggio da _Alex_ »

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.
Aki
Hero Member
Hero Member
Messaggi: 9970
Iscritto il: 27/12/2007, 16:59

Re: Compilazione con funzioni da libreria libm

Messaggio da Aki »

_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_mathe ... _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"
⢀⣴⠾⠻⢶⣦⠀
⣾⠁⢠⠒⠀⣿⡁ Debian - The universal operating system
⢿⡄⠘⠷⠚⠋⠀ https://www.debian.org
⠈⠳⣄⠀
_Alex_
Full Member
Full Member
Messaggi: 154
Iscritto il: 02/09/2017, 8:32
Località: Genova

Re: Compilazione con funzioni da libreria libm

Messaggio da _Alex_ »

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...
Aki
Hero Member
Hero Member
Messaggi: 9970
Iscritto il: 27/12/2007, 16:59

Re: Compilazione con funzioni da libreria libm

Messaggio da Aki »

_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 ?
⢀⣴⠾⠻⢶⣦⠀
⣾⠁⢠⠒⠀⣿⡁ Debian - The universal operating system
⢿⡄⠘⠷⠚⠋⠀ https://www.debian.org
⠈⠳⣄⠀
_Alex_
Full Member
Full Member
Messaggi: 154
Iscritto il: 02/09/2017, 8:32
Località: Genova

Re: Compilazione con funzioni da libreria libm

Messaggio da _Alex_ »

Si, grazie, ci penso io
Rispondi