неопределенная ссылка на sqrt (или другие математические функции) - PullRequest
54 голосов
/ 09 марта 2011

У меня есть этот простой код:

max = (int) sqrt (number);

и в заголовке у меня есть:

#include <math.h>

Но приложение все еще говорит неопределенную ссылку на sqrt.Вы видите здесь какие-либо проблемы?Похоже, все должно быть в порядке.

Ответы [ 4 ]

85 голосов
/ 09 марта 2011

Вы можете обнаружить, что вам нужно связываться с математическими библиотеками в любой системе, которую вы используете, например:

gcc -o myprog myprog.c -L/path/to/libs -lm
                                       ^^^ - this bit here.

Включение заголовков позволяет компилятору знать о объявлениях функций, но это делает не обязательно автоматически ссылается на код, необходимый для выполнения этой функции.

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

Следующий код прекрасно компилируется и связывается:

#include <math.h>
int main (void) {
    int max = sqrt (9);
    return 0;
}

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

Так, например, с учетом команд:

gcc -o plugh plugh.o -lxyzzy
gcc -o plugh -lxyzzy plugh.o

и plugh.o требует что-то из библиотеки xyzzy, второе может работать не так, как вы ожидаете.В месте, где вы перечисляете библиотеку, нет неразрешенных символов для удовлетворения.

И когда появляются неразрешенные символы из plugh.o do , уже слишком поздно.

24 голосов
/ 09 марта 2011

Полагаю, вы импортировали файл math.h с #include <math.h>

Так что единственная другая причина, которую я вижу, - это отсутствие информации о ссылках .Вы должны связать свой код с параметром -lm.

Если вы просто пытаетесь скомпилировать один файл с помощью gcc, просто добавьте -lm в командную строку, в противном случае предоставьте некоторую информацию о процессе сборки..

3 голосов
/ 09 июля 2017

Просто добавление #include <math.h> в исходный файл c и -lm в Makefile в конце будет работать для меня.

    gcc -pthread -o p3 p3.c -lm
0 голосов
/ 06 февраля 2017

У меня была такая же проблема, но я просто решил ее, добавив -lm после команды, которая запускает мой код.Пример.gcc code.c -lm

...