У меня есть этот простой код:
max = (int) sqrt (number);
а у меня в шапке:
#include <math.h>
Но приложение по-прежнему говорит о неопределенной ссылке на sqrt
. Вы видите здесь какую-то проблему? Вроде все должно быть в порядке.
У меня есть этот простой код:
max = (int) sqrt (number);
а у меня в шапке:
#include <math.h>
Но приложение по-прежнему говорит о неопределенной ссылке на 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
в свою командную строку, в противном случае предоставьте некоторую информацию о процессе сборки.
-lm
к вашей команде сборки.
- person krtek; 09.03.2011
Просто добавление #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.c -lm