Perché ricevo errori di collegamento quando chiamo la funzione in Math.h?
Domanda
Quando tento di chiamare funzioni in math.h
, ricevo errori di collegamento come i seguenti
undefined reference to sqrt
Ma sto facendo un #include <math.h>
Sto usando gcc e compilando come segue:
gcc -Wall -D_GNU_SOURCE blah.c -o blah
Perché il linker non riesce a trovare la definizione di sqrt
?
Soluzione
Aggiungi -lm al comando quando chiami gcc:
gcc -Wall -D_GNU_SOURCE blah.c -o blah -lm
Questo dirà al linker di collegarsi con la libreria matematica. Includere math.h dirà al compilatore che le funzioni matematiche come sqrt () esistono, ma sono definite in una libreria separata, che il linker deve impacchettare con il tuo eseguibile.
Come ha sottolineato FreeMemory, la libreria si chiama libm.a. Su sistemi simili a Unix, la regola per nominare le librerie è lib [blah] .a. Quindi se vuoi collegarli al tuo eseguibile usi -l [blah].
Altri suggerimenti
Devi collegare esplicitamente la libreria matematica. Aggiungi -lm
alle bandiere che stai passando a gcc in modo che il linker sappia collegare libm.a
Aggiungi -lm
alla fine del comando gcc per collegare la libreria matematica:
gcc -Wall -D_GNU_SOURCE blah.c -o blah -lm
Affinché le cose siano collegate correttamente, l'ordine delle bandiere del compilatore è importante! In particolare, math.h
dovrebbe essere posizionato alla fine della riga .
Se ti stai chiedendo perché la <=> libreria debba essere inclusa durante la compilazione in C, dai un'occhiata a questa spiegazione qui .