Подтвердить что ты не робот

Undefined ссылка на sqrt (или другие математические функции)

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

max = (int) sqrt (number);

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

#include <math.h>

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

4b9b3361

Ответ 1

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

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, это слишком поздно.

Ответ 2

Я предполагаю, что вы импортировали math.h с помощью #include <math.h>

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

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

Ответ 3

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

    gcc -pthread -o p3 p3.c -lm

Ответ 4

Вот мое наблюдение, во-первых, вам нужно включить заголовок math.h как функцию sqrt(), объявленную в заголовочном файле math.h. Например,

#include <math.h>

во-вторых, если вы прочитаете страницу руководства sqrt, вы заметите эту строку Связь с -lm.

#include <math.h> /* header file you need to include */

double sqrt(double x); /* prototype of sqrt() function */

Link with -lm. /* Library linking instruction */

Но приложение все еще говорит неопределенную ссылку на sqrt. Ты видишь проблема здесь?

Ошибка компилятора верна, поскольку вы не связали свою программу с библиотекой lm & компоновщик не может найти ссылку на sqrt(), вам нужно явно связать его. Например,

gcc -Wall -Wextra -Werror -pedantic test.c -lm

Ответ 5

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