Почему я получаю ошибки ссылок При вызове функции в Math.h?
Вопрос
При попытке вызвать функции в math.h
, я получаю ошибки ссылок, подобные следующим
undefined reference to sqrt
Но я делаю это #include <math.h>
Я использую gcc и компилирую следующим образом:
gcc -Wall -D_GNU_SOURCE blah.c -o blah
Почему компоновщик не может найти определение для sqrt
?
Решение
Добавьте -lm в команду при вызове gcc:
gcc -Стена -D_GNU_SOURCE бла -бла -бла -бла
Это подскажет компоновщику установить связь с математической библиотекой.Включение math.h сообщит компилятору, что математические функции, такие как sqrt(), существуют, но они определены в отдельной библиотеке, которую компоновщику необходимо упаковать с вашим исполняемым файлом.
Как указала freeMemory, библиотека называется libm.a .В Unix-подобных системах правилом для именования библиотек является lib[blah].a .Затем, если вы хотите связать их со своим исполняемым файлом, вы используете -l[blah] .
Другие советы
Вам нужно явно связать математическую библиотеку.Добавить -lm
к флагам, которые вы передаете в gcc, чтобы компоновщик знал, что нужно связать libm.a
Добавить -lm
до конца команды gcc для привязки математической библиотеки:
gcc -Wall -D_GNU_SOURCE blah.c -o blah -lm
Для правильного связывания объектов важен порядок следования флагов компилятора!В частности, -lm
должны быть размещены в конце строки.
Если вам интересно, почему math.h
библиотека вообще должна быть включена при компиляции на C, ознакомьтесь с этим объяснением здесь.