C Не удалось скомпилировать: не удается найти функции math.h
Я пишу поиск простых чисел. Математически, это быстрее, чем делать for (unsigned long i = 2; i < number/2; i++)
это намного быстрее, и все еще столь же эффективно, чтобы сделать for (unsigned long i = 2; i < sqrt(number); i++)
Но это не работает. Ниже мой код.
// Stuff goes up here, including a function prototype and:
#include <math.h>
char isPrime (unsigned long number)
{
if (number <= 1) {
return 0;
}
long double sqrtOfNumber = sqrt(number); // Calculate once.
for (unsigned long i = 2; i < sqrtOfNumber; i++) {
if (number%i == 0) { // It has a divisor.
return 0;
}
}
// Nothing broke us yet....
return 1;
}
И тогда ниже - ошибка, которую я получаю от GCC.
/tmp/ccFBlUz5.o: In function `isPrime':
main.c:(.text+0xb3): undefined reference to `sqrt'
collect2: error: ld returned 1 exit status
Изменение типа "число" на двойное вызывает проблемы с оператором%. И приведение его к удвоению для вызова sqrt() ничего не меняет.
Любой совет?
Да, и мой math.h импортируется, если я закомментирую эту строку, меня предупреждают, что там есть неявное объявление.
main.c: In function 'isPrime':
main.c:28:2: warning: implicit declaration of function 'sqrt' [-Wimplicit-function-declaration]
long double sqrtOfNumber = sqrt(number); // Calculate once.
^
main.c:28:29: warning: incompatible implicit declaration of built-in function 'sqrt' [enabled by default]
long double sqrtOfNumber = sqrt(number); // Calculate once.
^
плюс другое предупреждение под этим.
2 ответа
-lm
необходимо добавить в командную строку после файла, который требует эту библиотеку, например, если main.c
требуется математическая библиотека, то вы будете использовать:
gcc -x c main.c -lm
Вы можете увидеть живой пример здесь, в этом примере доступны три командные строки. Один без -lm
один с -lm
перед файлом, который нуждается в этом один после файлов, которые нуждаются в этом.
Для полноты картины, если мы обращаемся к документации gcc по опциям для ссылки, это говорит следующее для -l
:
[...] Это имеет значение, где в команде вы пишете эту опцию; компоновщик ищет и обрабатывает библиотеки и объектные файлы в указанном порядке. Таким образом, 'foo.o -lz bar.o' ищет библиотеку 'z' после файла foo.o, но перед bar.o. Если bar.o ссылается на функции в "z", эти функции могут быть не загружены. [...]
Вам нужно связать математическую библиотеку. Использовать -lm
опция в командной строке.