Почему я получаю ошибки ссылок при вызове функции в Math.h? - PullRequest
5 голосов
/ 19 сентября 2008

При попытке вызвать функции в math.h я получаю сообщения об ошибках, подобные следующим

undefined reference to sqrt

Но я делаю #include <math.h>
Я использую GCC и компилирую следующим образом:

gcc -Wall -D_GNU_SOURCE blah.c -o blah

Почему компоновщик не может найти определение для sqrt?

Ответы [ 3 ]

7 голосов
/ 19 сентября 2008

Добавьте -lm к команде при вызове gcc:
gcc -Wall -D_GNU_SOURCE blah.c -o blah -lm

Это скажет компоновщику связываться с математической библиотекой. Включение math.h сообщит компилятору, что математические функции, такие как sqrt (), существуют, но они определены в отдельной библиотеке, которую компоновщик должен упаковать с вашим исполняемым файлом.

Как указало FreeMemory, библиотека называется libm.a. В Unix-подобных системах правило именования библиотек - lib [blah] .a. Затем, если вы хотите связать их с вашим исполняемым файлом, вы используете -l [blah].

2 голосов
/ 19 сентября 2008

Вам необходимо явно связать математическую библиотеку. Добавьте -lm к флагам, которые вы передаете в gcc, чтобы компоновщик знал, что нужно связать libm.a

1 голос
/ 25 августа 2017

Добавьте -lm в конец команды gcc, чтобы связать библиотеку математики:

gcc -Wall -D_GNU_SOURCE blah.c -o blah -lm

Для правильного связывания важен порядок флагов компилятора! В частности, -lm должен быть помещен в конце строки .

Если вам интересно, зачем вообще включать библиотеку math.h при компиляции в C, посмотрите это объяснение здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...