У меня есть этот простой код:
max = (int) sqrt (number);
и в заголовке у меня есть:
#include <math.h>
Но приложение все еще говорит undefined ссылку на sqrt
. Вы видите здесь какую-либо проблему? Похоже, все должно быть хорошо.
У меня есть этот простой код:
max = (int) sqrt (number);
и в заголовке у меня есть:
#include <math.h>
Но приложение все еще говорит undefined ссылку на sqrt
. Вы видите здесь какую-либо проблему? Похоже, все должно быть хорошо.
Вы можете обнаружить, что вам нужно связать с математическими библиотеками любую используемую вами систему, например:
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
, это слишком поздно.
Я предполагаю, что вы импортировали math.h с помощью #include <math.h>
Таким образом, единственная причина, по которой я могу видеть, - это отсутствующая ссылка. Вы должны связать свой код с опцией -lm
.
Если вы просто пытаетесь скомпилировать один файл с gcc, просто добавьте -lm
в свою командную строку, в противном случае дайте некоторую информацию о вашем строительном процессе.
Просто добавив #include <math.h>
в исходный файл c, а -lm в Makefile в конце будет работать для меня.
gcc -pthread -o p3 p3.c -lm
Вот мое наблюдение, во-первых, вам нужно включить заголовок 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
У меня была такая же проблема, но я просто решил ее, добавив -lm после команды, которая запускает мой код. Пример. gcc code.c -lm